Leetcode-初級演算法-存在重複元素
阿新 • • 發佈:2018-12-21
本文首發於我的個人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; } };