287. 寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
解题思路: 本题规定了空间复杂度为
O
(
1
)
O(1)
O(1)说明不能使用哈希记录每个数出现的频率,规定了时间复杂度小于
O
(
n
2
)
O(n^2)
O(n2),虽然排序的平均时间复杂度可达到
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),但是最坏时间复杂度依然为
O
(
n
2
)
O(n^2)
O(n2),因此依然不是好的方法,最后参考了网友Grandyang的解法发现,此题可以用二分查找解题。因为本题有一个数重复,并所有的数都在[1,n]范围内,当我们取中间索引时,然后统计序列中小于中间索引的数的个数,如果个数小于中间索引的话,说明重复数不在小数里,则left移动,否则right移动。其实此题二分查找找的不是数组中的数,而是找的统计的个数。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = (left + right) / 2, cnt = 0;
for (int num : nums) {
if (num <= mid) ++cnt;
}
if (cnt <= mid) left = mid + 1;
else right = mid;
}
return right;
}
};