题目

  • 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
如果我的文章对你有用,请随意赞赏