287. Find the Duplicate Number
Posted 我的名字叫周周
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了287. Find the Duplicate Number相关的知识,希望对你有一定的参考价值。
/* * 287. Find the Duplicate Number * 12.7 by Mingyang * 占位问题,多次遇到过了,另一种解法是Binary Search * 如果题目要求不能动这个array,那么占位不行,因为他不能被 * swapnums[i] != i + 1很重要 */ public static int findDuplicate1(int[] nums) { int len = nums.length; if (nums == null || nums.length == 0) return 0; for (int i = 0; i < len; i++) { while (nums[i] != i + 1) { // 为什么这么个条件呢,因为有可能遇到这种情况, //1,2,2当把1换到2的时候,下一步走到1就返回1了,所以特别注意这一点 //错了,是因为1==1,所以返回1,还没做任何事情 if (nums[i] == nums[nums[i] - 1]) return nums[i]; else swap1(nums, i, nums[i] - 1); } } return 0; } //下面是最好的方法,就是说我们需要计算比中间值小的个数 public int findDuplicate(int[] nums) { int n = nums.length - 1; int low = 0, high = n; int mid = 0; while (low < high) { mid = low + (high - low) / 2; int c = count(nums, mid); // count #numbers less than mid.一定有一个值,所以不用等于 if (c <= mid) { low = mid + 1; } else { high = mid; } } return low; } private int count(int[] nums, int mid) { int c = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] <= mid) c++; } return c; }
以上是关于287. Find the Duplicate Number的主要内容,如果未能解决你的问题,请参考以下文章
287. Find the Duplicate Number
287. Find the Duplicate Number
287. Find the Duplicate Number
287. Find the Duplicate Number