描述
給你一個(gè)含 n 個(gè)整數(shù)的數(shù)組 nums ,其中 nums[i] 在區(qū)間 [1, n] 內(nèi)。請(qǐng)你找出所有在 [1, n] 范圍內(nèi)但沒(méi)有出現(xiàn)在 nums 中的數(shù)字,并以數(shù)組的形式返回結(jié)果。
鏈接
448. 找到所有數(shù)組中消失的數(shù)字 - 力扣(LeetCode) (leetcode-cn.com)
?
解法:特殊標(biāo)記(使得空間復(fù)雜度為 O(1))
如何利用 nums 作為輔助數(shù)組,來(lái)記錄每個(gè)數(shù)字是否出現(xiàn)呢?
對(duì)于第 i 個(gè)數(shù)字 nums[i],我們位置 (nums[i] - 1) % n 的位置增加 n,這樣不會(huì)覆蓋原數(shù)組,因?yàn)?(nums[i] - 1) % n = (nums[i] - 1 + n) % n,這樣如果最后遍歷完數(shù)組,nums[i] 小于等于 n,就是數(shù)組中中消失的數(shù)字。
下圖以示例數(shù)據(jù)為例,演示了方法二的思路。
?
1 class Solution { 2 public List<Integer> findDisappearedNumbers(int[] nums) { 3 int n = nums.length; 4 for (int num : nums) { 5 int x = (num - 1) % n; // 對(duì)應(yīng)的 序號(hào) 6 nums[x] += n; // 把 有序號(hào)的 相加了 一遍 7 } 8 List<Integer> ret = new ArrayList<Integer>(); 9 for (int i = 0; i < n; i++) { 10 if (nums[i] <= n) { 11 ret.add(i + 1); 12 } 13 System.out.println("nums:" + i + "," + nums[i]); 14 } 15 return ret; 16 } 17 }
?
解法二:哈希表
?
1 class Solution { 2 public List<Integer> findDisappearedNumbers(int[] nums) { 3 List<Integer> res = new ArrayList<>(); 4 Set<Integer> dic = new HashSet<>(); 5 for(int num : nums) { 6 dic.add(num); 7 } 8 9 for(int i= 1; i <= nums.length; i++) { 10 if(!dic.contains(i)) { 11 res.add(i); 12 } 13 } 14 return res; 15 } 16 }
?
參考
找到所有數(shù)組中消失的數(shù)字 - 力扣(LeetCode) (leetcode-cn.com)
?
本文摘自 :https://www.cnblogs.com/