本文主要是介绍力扣287. 寻找重复数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;}
};
这篇关于力扣287. 寻找重复数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!