1. 程式人生 > >Leetcode442. 通過雜湊表找出陣列重複元素

Leetcode442. 通過雜湊表找出陣列重複元素

Leetcode442. Find All Duplicates in an Array

題目

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?

Example:
Input: The root of a Binary Search Tree like this:
[4,3,2,7,8,2,3,1]
Output: The root of a Greater Tree like this:
[2,3]

解題分析

這道題看起來很簡單,用最樸素的演算法,用兩層迴圈就可以解決,但這樣時間複雜度就為O(n^2)(顯得有些浪費了),而題目要求我們採用O(n)的演算法,所以我們只能另闢蹊徑了。

我們都知道雜湊表儲存的key-value的值,可以通過key快速索引到value。這裡我想到了C++11中的新特性unordered_map,一種特殊的雜湊表,其內部元素是無序的。
我們可以用陣列中的元素的值來作為key,而將它們在陣列中出現的次數作為value,這樣我們通過遍歷整個雜湊表,找出value值大於1所對應的key值就可以了,是不是很簡單呢?

原始碼

class Solution {
public
: vector<int> findDuplicates(vector<int>& nums) { vector<int> v; unordered_map<int, int> map; int i; sort(nums.begin(), nums.end()); for (i = 0; i < nums.size(); i++) { map[nums[i]]++; } for (auto iter = map
.begin(); iter != map.end(); iter++) { if (iter->second > 1) { v.push_back(iter->first); } } return v; } };

這只是我對這道題的一些想法,有問題還請在評論區討論留言~