正文
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.代码思路
采用类似于折半查找
的思路求解我们的问题