leetcode 217.存在重複元素
阿新 • • 發佈:2018-11-22
題目描述:
給定一個整數陣列,判斷是否存在重複元素。
如果任何值在陣列中出現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。
思路:
最直接的想法是:呼叫STL的去重演算法,然後比較去重前後陣列長度是否變化...不過這樣做沒什麼意義。
然後想到的是:先排序,再判斷是否有相鄰兩個元素的值相等。
bool containsDuplicate(vector<int>& nums) { if(nums.size()==0) return false; //排序 sort(nums.begin(),nums.end()); //是否有相鄰的兩個元素相等 for(int i=0;i<nums.size()-1;i++) if(nums[i]==nums[i+1]) return true; return false; }
效果還不錯,測試耗時24ms,由於使用了sort,時間複雜度應該是O(nlogn)。
但是存在一個問題:我沒必要把整個向量排序,完全可以在排序的過程中就查找出相同的元素!
寫寫驗證一下吧。
先試試選擇排序:
bool containsDuplicate(vector<int>& nums) { if(nums.size()==0) return false; int n=nums.size(); for(int i=0;i<n;i++) { int max=0; for(int j=1;j<n-i;j++) if(nums[j]==nums[max]) return true; else if(nums[j]>nums[max]) max=j; swap(nums[n-1-i],nums[max]); } return false; }
超出時間限制...那麼相同時間複雜度的插入排序也就不用試了。
但是!在我關掉頁面前,心血來潮寫了個暴力版的,竟然通過了:
bool containsDuplicate(vector<int>& nums) { if(nums.size()==0) return false; int n=nums.size(); for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(nums[i]==nums[j]) return true; return false; }
執行測試用時1700ms...這都能過,那估計上面的選擇排序我寫的有問題。
下次再檢查吧,今晚該睡了。另外我有個新想法:做插入排序,插入排序的位置用二分查詢。這樣的話似乎也能把時間複雜度降低到O(nlogn)。