Problem: 287. 寻找重复数
文章目录
- 题目描述
- 思路
- 解题方法
- 复杂度
- Code
题目描述
思路
利用二分查找搜索1 ~ n中重复的元素,我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count:
若count > mid则说明重复的元素在区间[left, mid]中缩小区间查找区间**[left, mid]**
若count <= mid则说明重复的元素在区间[mid + 1, right]中缩小区间查找区间**[mid + 1, right]**
解题方法
1.获取数组nums的大小len,定义左右指针left = 1,right = len - 1;
2.当left < right时,每次计算当前区间的中间值mid = left + (right - left),并统计nums中小于等于mid的元素个数count;
3.若count > mid则使得right = mid;
4.若count <= mid则使得left = mid + 1
复杂度
时间复杂度:
O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
public:
/// <summary>
/// Find the repeated number
/// </summary>
///
/// <param name="nums"> Given array </param>
/// <returns> int </returns>
int findDuplicate(vector<int>& nums) {
int len = nums.size();
int left = 1;
int right = len - 1;
while (left < right) {
int mid = left + (right - left) / 2;
int count = 0;
for (int num : nums) {
if (num <= mid) {
count++;
}
}
if (count > mid) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
};