Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

不使用额外空间,找出数组重复数字

给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。

请找出数组中任意一个重复的数,但不能修改输入的数组。

样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。

返回 2 或 3。

思考题:如果只能使用 O(1) 的额外空间,该怎么做呢?

思考: 把肯定不符合条件的一半给忽略掉;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int l = 1, r = nums.size() - 1;
while (l < r) {
int mid = (l + r) >> 1; //[l, mid], [mid + 1, r]
int s = 0;
//注意这里是遍历了所有的元素
for (int i = 0; i < nums.size(); ++i) s += (nums[i] >= l && nums[i] <= mid);
if (s > (mid - l + 1)) r = mid;
else l = mid + 1; //数量不够,说明这个区间内的某个数肯定被替换掉了,所以肯定在另外一边。
}

return r;
}
};
你的支持是我坚持的最大动力!