n个数字,范围为[0,n1],求重复数字

时间复杂度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 };

 听虾皮的面试官说还可以通过位偏移的方法找,但目前我没思路。

心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/15760133.html