[287. 寻找重复数]

简介: [287. 寻找重复数]

正文


1.题目表述


给定一个包含 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) 。数组中只有一个重复的数字,但它可能不止重复出现一次。


2.编写代码


package com.breakpoint.code;
/**
* 287. 寻找重复数
*
* @author breakpoint
*
*/
public class Main287 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = { 1, 3, 4, 2, 1 };
int target = new Main287().findDuplicate(nums);
System.out.println(target);
}
public int findDuplicate(int[] nums) {
int l = 1, r = nums.length - 1, count = 0, targetCount = 0;
int target = (l + r) / 2;
while (l <= r) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] < target) {
count++;
}
if (nums[i] == target) {
count++;
targetCount++;
}
}
if (count > target) {
if (targetCount > 1) {
return target;
}
r = target - 1;
target = (l + r) / 2;
} else {
l = target + 1;
target = (l + r) / 2;
}
count = 0;
targetCount = 0;
}
return -1;
}
}

3.其他信息


时间复杂度:o(n*logn)

空间复杂度:o(1)


4.代码思路


采用类似于折半查找的思路求解我们的问题

相关文章
|
6月前
最小操作次数问题
最小操作次数问题
44 1
|
6月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
6月前
4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数
4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数
26 0
|
6月前
|
算法 测试技术 C#
【位运算 试填法】【推荐】3022. 给定操作次数内使剩余元素的或值最小
【位运算 试填法】【推荐】3022. 给定操作次数内使剩余元素的或值最小
|
6月前
leetcode-287:寻找重复数
leetcode-287:寻找重复数
31 0
|
算法 前端开发
前端算法-寻找重复数
前端算法-寻找重复数
1245:不重复地输出数 2020-12-28
1245:不重复地输出数 2020-12-28
随机1-100的数循环找出88的次数
随机1-100的数循环找出88的次数
85 0
LeetCode 287. 寻找重复数
LeetCode 287. 寻找重复数
121 0
LeetCode 287. 寻找重复数