力扣287. 寻找重复数

Problem: 287. 寻找重复数

题目描述

在这里插入图片描述在这里插入图片描述

思路

利用二分查找搜索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;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值