Lc448_找到全部數組中消失的數字

package com.example.demo;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

/**
 * 448. 找到全部數組中消失的數字
 * 給定一個範圍在  1 ≤ a[i] ≤ n ( n = 數組大小 ) 的 整型數組,數組中的元素一些出現了兩次,另外一些只出現一次。
 * <p>
 * 找到全部在 [1, n] 範圍之間沒有出如今數組中的數字。
 * <p>
 * 您能在不使用額外空間且時間複雜度爲O(n)的狀況下完成這個任務嗎? 你能夠假定返回的數組不算在額外空間內。
 * <p>
 * 示例:
 * <p>
 * 輸入:
 * [4,3,2,7,8,2,3,1]
 * <p>
 * 輸出:
 * [5,6]
 */
public class Lc448 {


    /**
     * 經過hash的key value 肯定缺失的數字
     * @param nums
     * @return
     */
    public static List<Integer> findDisappearedNumbers(int[] nums) {

        // Hash table for keeping track of the numbers in the array
        // Note that we can also use a set here since we are not
        // really concerned with the frequency of numbers.
        HashMap<Integer, Boolean> hashTable = new HashMap<Integer, Boolean>();

        // Add each of the numbers to the hash table
        for (int i = 0; i < nums.length; i++) {
            hashTable.put(nums[i], true);
        }

        // Response array that would contain the missing numbers
        List<Integer> result = new LinkedList<Integer>();

        // Iterate over the numbers from 1 to N and add all those
        // that don't appear in the hash table.
        for (int i = 1; i <= nums.length; i++) {
            if (!hashTable.containsKey(i)) {
                result.add(i);
            }
        }

        return result;
    }


    public static void main(String[] args) {
        int[] nums = {4, 3, 2, 7, 8, 2, 3, 1};
        findDisappearedNumbers(nums).forEach(n -> {
            System.out.println(n);
        });
        System.out.println();
    }
}
相關文章
相關標籤/搜索