當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

448. 找到所有數(shù)組中消失的數(shù)字
2021-11-30 22:45:10

描述

給你一個(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/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >