时间复杂度O(n),空间复杂度O(1)
思路:把数字v放到索引为v的位置上去。但如果位置v上的数字本身就是v时,说明数字v重复了。
1 class Solution { 2 public: 3 /** 4 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 5 * 6 * 7 * @param numbers int整型vector 8 * @return int整型 9 */ 10 void swaps(vector<int>& data, int x, int y) { 11 int tmp = data[x]; 12 data[x] = data[y]; 13 data[y] = tmp; 14 } 15 16 int duplicate(vector<int>& number) { 17 // write code here 18 int i = 0; 19 while (i < number.size()) { 20 if (number[i] == i) ++i; // 如位置0上的元素是0 21 else if (number[i] == number[number[i]]) return number[i]; 22 else swaps(number, number[i], i); // 这里只交换,不做i=number[i]操作 23 } 24 return -1; 25 } 26 };
听虾皮的面试官说还可以通过位偏移的方法找,但目前我没思路。