版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述
来源:力扣(LeetCode),点击查看出处原题
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),
可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
例 1:
输入: [1,3,4,2,2]
输出: 2
示例 2:
输入: [3,1,3,4,2]
输出: 3
说明:
- 不能更改原数组(假设数组是只读的)。
- 只能使用额外的 O(1) 的空间,时间复杂度小于 O(n2) 。
- 数组中只有一个重复的数字,但它可能不止重复出现一次。
思路分析:
- 第一条不能更改数组,既不能排序,但是在不改变原有数组的顺序前提下表排序(间接排序)可以排序使用;
- 第二条不能用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;
}