1.题目描述:
给定一个包含n + 1个整数的数组nums,其数字都在1到n之间(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,找出这个重复的数。
额外需求:不修改数组nums且只用常量级O(1)的额外空间。
2.暴力解法:
循环遍历判断后面是否有重复元素,正好满足题目条件,但是提交之后显示超出时间限制。ps:如果没有题设的额外需求可以使用哈希表或者数组来记录数组元素出现的频次,根据频次来找寻重复的数据,思路类似之前写的图解leetcode645.错误的集合。
class Solution {
public int findDuplicate(int[] nums) {
int dupEle = 0;
boolean flag = false;
for(int i = 0;i < nums.length;i++){
for(int j = i + 1;j < nums.length;j++){
if(nums[i] == nums[j]){
return nums[i];
}
}
}
return -1;
}
}
3.二分查找:
二分查找的模型抽取比较难想到,遍历数组,记录小于等于某一元素x的元素数目,发现数目随着x的增大而增大,并且记录的数目存在规律,详细见图解:
代码如下:
class Solution {
public int findDuplicate(int[] nums) {
int left = 1;
int right = nums.length - 1;
int mid;
while(left <= right){
int count = 0;
mid = (left + right) / 2;
for(int ele:nums){
if(ele <= mid){
count++;
}
}
if(mid < count){
right = mid - 1; //记录mid < count的最小索引
}else{
left = mid + 1;//记录mid = count的最大索引
}
}
return left;//此处也可返回right + 1
}
}
4.双指针/环形列表解法(待更新)
5.二进制(待更新)