1. 程式人生 > >Leetcode-初級演算法-存在重複元素

Leetcode-初級演算法-存在重複元素

本文首發於我的個人Blog阿西BUG,歡迎大家批評指正

題目

給定一個整數陣列,判斷是否存在重複元素。
如果任何值在陣列中出現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。

示例1
輸入: [1,2,3,1]
輸出: true

示例 2:
輸入: [1,2,3,4]
輸出: false

示例 3:
輸入: [1,1,1,3,3,4,3,2,4,2]
輸出: true

自己的思路

思路1

雙層迴圈,就是想著說先用最笨的辦法實現了,後面在優化

耗時:1764ms

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            for (int j = i + 1; j < size; j++){
                if (nums[i] == nums[j])
                    return true;
            }
        }
        return false;
    }
};

思路2

採用雙指標迴圈法
基準指標先指向陣列的第0個位置,遊標指標指向陣列的第1個位置,比較資料是否相等
若想等,則返回true
若不等,則遊標指標所指向的資料複製到基準指標的下一位,基準指標和遊標指標各自從當前位置向後移一位,再次比較

耗時:24ms

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int size = nums.size();
        if (1 == size) {
            return false;
        }
        sort(nums.begin(), nums.end());
    
        int start = 0;
        int next = 1;
        while (next < size) {
            if (nums[start] == nums[next]) {
                return true;
            }
            else {
                nums[start +1] = nums[next];
                ++start;
                ++next;
            }
        }
        return false;
    }
};

網上優秀思路

在陣列不為空且陣列元素個數大於2的情況下,對陣列元素迴圈對比,同時,用一個臨時變數來儲存從0到i-1之間的最大元素,如果當前值比之前的值都大,那麼這之前的值裡面不可能有比它再大的值,從而就減少了查詢次數

耗時:8ms

static const auto xxx = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        if(nums.empty() || 1 == nums.size())
        {
            return false;
        }
        int temp = nums[0];
        for(int i = 1; i < nums.size(); ++i)
        {
            if(temp < nums[i])
            {
                temp = nums[i];
            }
            else if(temp == nums[i])
            {
                return true;
            }
            else
            {
                for(int j = 0; j < i; ++j)
                {
                    if(nums[i] == nums[j])
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }
};