题目

  • 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

本文题目Find the Duplicate Number

代码详解

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i ++ ) {
            int index = abs(nums[i]) - 1;
            // 标记已访问
            nums[index] *= -1;
            
            if (nums[index] > 0)   // 访问到两次
                return abs(nums[i]);
        }
        return 0;
    }
};

用取负数来标记访问次数

  • $Input: nums = [1,3,4,2,2]$

$$ \begin{align} & index\space =\space nums[0]\space -\space 1\space =\space 0;\\ & nums[0]\space =\space 1\space *\space (-1)\space =\space -1;\\ & index\space =\space nums[1]\space - \space 1\space =\space 2;\\ & nums[2]\space =\space 4\space *\space (-1)\space =\space -4;\\ & index\space =\space nums[2]\space -\space 1\space =\space 3;\\ & nums[3]\space =\space 2\space *\space (-1)\space =\space -2;\\ & index\space =\space nums[3]\space -\space 1\space =\space 1;\\ & nums[1]\space =\space 3\space *\space (-1) \space =\space -3;\\ & index\space =\space nums[4]\space -\space 1\space =\space 1;\\ & nums[1]\space =\space -3\space *\space (-1)\space =\space 3\space >\space 0;\\ & return\space nums[4]\space // 返回 2 \end{align} $$

  • 至此,不难看出,由于重复出现的数只有一个,即整数$\space [1,\space n]\space $中有$\space n-2 \space $个都是唯一的,他们与其$\space nums[index] \space$都是一一对应,只有重复的数两次取反之后为正数
最后修改:2023 年 01 月 25 日 08 : 54 PM
如果我的文章对你有用,请随意赞赏