Given an array nums containing n + 1 integers where each integer is between 1 and
n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than
.
O(n2) - There is only one duplicate number in the array, but it could be repeated more than once.
思考路线:
1) 排序后遍历:不符合条件1的要求,数组不可改;
2) map:不符合条件2的要求,O(n)的空间复杂度。
思路:针对2,想起了First Missing Number的解法,数组既保存原有数组信息,又保存map信息。直接遍历数组nums,
遍历到元素i,将nums[i]置为-1*nums[i],此时nums[i]为负;若下次又遍历到i,即可检查到nums[i]为负,即可知道数字i为Dumplicate数。
误区:写的过程中,进入误区了,只要遍历遇到i,则将nums[i]置为-1*nums[i],遍历完后再次遍历,若是有负数,即对应的下标为
Dumplicate数。这样考虑是因为以为只会重复两次,但是题目并没有这么说,即如果存在多次(比如偶数次),最后还是可能转为正数。
代码:
public class Solution { public int findDuplicate(int[] nums) { int index, length = nums.length, result = 0; for(int i = 0; i < length; i++) { index = nums[i]; if(index < 0) { index *= -1; } if(nums[index] < 0) { result = index; break; } else { nums[index] *= -1; } } return result; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 20:37:01