Leetcode-287. 寻找重复数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44116998/article/details/101900929

题目描述
来源:力扣(LeetCode),点击查看出处原题
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),
可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

例 1:
输入: [1,3,4,2,2]
输出: 2

示例 2:
输入: [3,1,3,4,2]
输出: 3

说明:

  1. 不能更改原数组(假设数组是只读的)。
  2. 只能使用额外的 O(1) 的空间,时间复杂度小于 O(n2) 。
  3. 数组中只有一个重复的数字,但它可能不止重复出现一次。

思路分析:

  • 第一条不能更改数组,既不能排序,但是在不改变原有数组的顺序前提下表排序(间接排序)可以排序使用;
  • 第二条不能用O(n2)算法查找,比如只要会改变原有的先后顺序的算法都是O(n^2)的算法,但是二分按值查找的时间复杂度是O(nlogn),可以使用;然后呢O(1)的空间也不能使用计数的方法实现;
  • 第三条有一种求和再减去1+2+3…+n(即n(n+1)/2)的和即可,但是重复的数字不止重复一次;

代码实现

/*
 Name: leetcode -287-重复数 
 Author: liu Baolin 
 Date: 02/10/19 09:52
*/
#include<iostream>
using namespace std;
int Binary_search( int n , int num[])
{
	int left = 1,right = n;
	while( left < right ){
		int count = 0,i = 0;
		int mid = ( right + left ) / 2;
		while( i <= n)
			if(mid >= num[i++])
				count++;
		if(mid < count)
			right = mid;
		else
			left = mid + 1; 
	}
	return left;
}

int main()
{
	int n;//元素个数
	cin>>n; 
	int num[ n + 1 ];
	for(int i = 1;i <= n ;i++)
		cin>>num[i];
	cout<<"重复的元素为"<<Binary_search( n , num)<<endl;
	return 0;
	}

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/101900929