leetcode - find All Duplicates in an Array
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?
Example:Input: [4,3,2,7,8,2,3,1]
Output: [2,3]
这个题目我也是看了答案才想得到是这个做法,然后过几天再做一次ac了。
首先看下题目,题目提示a[i]<= n。这个限制肯定是有目的的,我们可以推测我们在大案例应该会用到a[i]的值用作index
这个题目的思路如下:
因为我们要找到重复的数字,所以我们需要找到一个方法标记一下当前数字已经出现过了,再加上题目提示每一个数字都是小于array size,所以我们就接着推测用当前数字 - 1作为index (因为数字有可能是等于数组大小),然后再把这个index上的数字改为负数: [1,2,3,4,5] -> 当前数字为1, 那么 index(1-1 = 0) 上的数字, which is 1 就要变成-1.
因为下一次再到第二次出现1的时候, 我们会找回到这个 1-1=0 的index 上,看是否已经出现过一次。
为了保证遍历的时候数字不是负数,我们用abs(numbers[i])。
1 class Solution { 2 public List<Integer> findDuplicates(int[] nums) { 3 List<Integer> ls = new ArrayList<>(); 4 for (int i = 0; i < nums.length; i++) { 5 int current = Math.abs(nums[i]); 6 int match = nums[current - 1];
// if the number on the index is negative, that means the number has appeared once 7 if (match < 0) { 8 ls.add(current); 9 } else { 10 nums[current - 1] = -1 * match; 11 } 12 } 13 return ls; 14 } 15 }