Find the Duplicate Number

Problem

Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive.

There is only one repeated number in nums, return this repeated number.

You must solve the problem without modifying the array nums and uses only constant extra space.

Example 1:

Input: nums = [1,3,4,2,2]
Output: 2

Example 2:

Input: nums = [3,1,3,4,2]
Output: 3

Example 3:

Input: nums = [3,3,3,3,3]
Output: 3

Constraints:

  • 1 <= n <= 105
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • All the integers in nums appear only once except for precisely one integer which appears two or more times.

Follow up:

  • How can we prove that at least one duplicate number must exist in nums?
  • Can you solve the problem in linear runtime complexity?

Solution

I thought this was a XOR question, but it turns out that I misunderstood the prompt.

This is similar to the linked list cycle question.

class Solution {
    public int findDuplicate(int[] nums) {
        var slow = 0;
        var fast = 0;

        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while (slow != fast);

        fast = 0;
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }

        return slow;
    }
}

Recent posts from blogs that I like

On Reflection: Hodler and Klimt

Unusual use and manipulation of reflections by Ferdinand Hodler in his Parallelism, and by Gustav Klimt painting through a telescope on his summer holidays.

via The Eclectic Light Company

Is Claude Code going to cost $100/month? Probably not - it's all very confusing

via Simon Willison

Luddites and AI datacenters

Is it time to start burning down datacenters?

Some people think so. An Indianapolis city council member had his house recently shot up for supporting datacenters, and Sam Altman’s home was firebombed (and then shot) shortly afterwards. People from all sides of the argument are sounding the alarm abo...

via Sean Goedecke