LeetCode442. 陣列中重複的資料
阿新 • • 發佈:2018-12-16
給定一個整數陣列 a,其中1 ≤ a[i] ≤ n (n為陣列長度), 其中有些元素出現兩次而其他元素出現一次。
找到所有出現兩次的元素。
你可以不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?
示例:
輸入: [4,3,2,7,8,2,3,1] 輸出: [2,3]
思路:使用額外的同nums陣列空間大小相同的陣列為nums陣列中的元素構建雜湊表。最後記錄出現次數大於1的元素。
class Solution { public List<Integer> findDuplicates(int[] nums) { List<Integer> res=new LinkedList<Integer>(); int a[]=new int[nums.length]; for(int i=0;i<nums.length;i++){ a[nums[i]-1]++; } for(int i=0;i<nums.length;i++){ if(a[i]>1){ res.add(i+1); } } return res; } }
解法二:不使用額外的空間(參考LeetCode)
class Solution { public static List<Integer> findDuplicates(int[] nums) { int n = nums.length; for(int i = 0; i < n; i++) { while(nums[i] != i + 1) { if(nums[nums[i] - 1] == nums[i]) { break; } int tmp = nums[nums[i] - 1]; nums[nums[i] - 1] = nums[i]; nums[i] = tmp; } } List<Integer> list = new ArrayList<>(); for(int i = 0; i < n; i++) { if(nums[i] != i + 1) { list.add(nums[i]); } } return list; } }