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

Colin Campbell Cooper painting America: 1912-1923

He was on board the Carpathia when it rescued survivors from the Titanic, and moved to the West Coast in 1915, where he painted its lush vegetation and rich light.

via The Eclectic Light Company

sometimes you get stuck in a sinkhole for a few years

tales from the bog

via bookbear express

Datasette Apps: Host custom HTML applications inside Datasette

via Simon Willison