1. 程式人生 > >leetcode 217.存在重複元素

leetcode 217.存在重複元素

題目描述:

給定一個整數陣列,判斷是否存在重複元素。

如果任何值在陣列中出現至少兩次,函式返回 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)。