給定一個數(shù)組,數(shù)組中的元素的范圍恰好是1到數(shù)組的大小,有些元素重復(fù)出現(xiàn)兩次,有些元素只出現(xiàn)一次,求1到n范圍里面沒有出現(xiàn)在數(shù)組中的數(shù)的集合。限定O(n)不能使用額外空間。 思考:限定O(n),思考使用計數(shù)排序,但是不能使用額外空間,所以利用題目所給的條件范圍恰好是1到數(shù)組的大小,這和計數(shù)排序是差不多的思想,出現(xiàn)的數(shù)-1==的數(shù)組的下標。而不會越界。所以遍歷到的數(shù)就可以直接將數(shù)組對應(yīng)下標元素標記為已出現(xiàn),如第一個數(shù)3就標記s[2],怎么標記為已出現(xiàn),而不影響到數(shù)組后面的遍歷?取負數(shù),遍歷到的時候再取絕對值,遇到已經(jīng)標記的數(shù),就不需要再標記了,所以標記的時候要判斷是否大于0。最后再遍歷整個數(shù)組大于0的數(shù)就是沒出現(xiàn)過的數(shù)。 public class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { for(int i=0;i<nums.length;i++) { int index =Math.abs(nums[i])-1; if(nums[index]>0) nums[index]=-nums[index]; } List<Integer> list = new ArrayList<Integer>(); for(int j=0;j<nums.length;j++) { if(nums[j]>0) list.add(j+1); } return list; } } |
|
來自: Dragon_chen > 《數(shù)組》