標籤:
Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.
解法1:暴力破解,時間複雜度O(n^2)。從頭至尾掃描數組,將當前值與數組其他值一一進行比較,若有相同,則返回true;否則直到數組末尾仍沒找到重複值,則返回false。
class Solution {public: bool containsDuplicate(vector<int>& nums) { int n = nums.size(); for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { if(nums[i] == nums[j]) return true; } } return false; }};
解法2:先將數組按升序排序,然後比較相鄰的兩個元素是否有相等的即可。因為一般交換排序最快可以達到O(nlogn),最後掃描一趟耗時O(n),因此時間複雜度為O(nlogn)。
class Solution {public: bool containsDuplicate(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); for(int i = 0; i < n - 1; i++) { if(nums[i] == nums[i + 1]) return true; } return false; }};
解法3:由解法2引申想到空間換時間的方法,桶排序或者計數排序等都可以使得時間複雜度降到O(n),因此整個演算法時間複雜度為O(n)。但是此法有個缺點:輸入數組的元素範圍需在一定範圍內,並且已知這個範圍。一個好的方法即是使用STL的map,也可以自己實現Hash表和相應演算法。
class Solution {public: bool containsDuplicate(vector<int>& nums) { int n = nums.size(); map<int, int> mii; for(int i = 0; i < n; i++) { int cnt = ++mii[nums[i]]; if(cnt > 1) return true; } return false; }};
[LeetCode]10. Contains Duplicate重複資料偵測