1. 程式人生 > >查詢表 219.Contains Duplicate(2),217 Contain Duplicate, 220(3)

查詢表 219.Contains Duplicate(2),217 Contain Duplicate, 220(3)

 

 

思路:滑動視窗(長度為k+1)看這個窗口裡的是否有兩個元素的值相同。加查詢表。

//時間:O(n)
//空間:O(k)
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_set<int> record;   //查詢表
        for(int i=0; i<nums.size();i++)
        {
            if(record.find(nums[i])!= record.end() )
                
return true; record.insert(nums[i]); //保持record中最多有k個元素,當右邊有一個新的元素加入時,窗口才會變成k+1 if(record.size()==k+1) record.erase(nums[i-k]); } return false; } };

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set
<int> record; for(int i=0;i<nums.size();i++){ if(record.find(nums[i])!=record.end()) return true; record.insert(nums[i]); } return false; } };

 

函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置.

注意:如果所有元素都小於val,則返回last的位置,且last的位置是越界的!!

//時間:O(nlogn)
//空間:O(k)

 

 對於陣列中有2147483647這個值時,當nums[i]+t 容易造成整型溢位。注意整型溢位,改變型別為 long long

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        //long long 64位整型
        set<long long > record;  //因為呼叫lower_bound 需要有順序性,所以使用set
        for(int i=0;i<nums.size();i++){
            //查詢大於或等於nums[i]-t的第一個元素的位置
            if(record.lower_bound( (long long)nums[i]-(long long)t) != record.end() &&
              *record.lower_bound( (long long)nums[i]-(long long)t)<= (long long)nums[i]+(long long)t)
                return true;
            record.insert(nums[i]);
            
            if(record.size() == k+1)
                record.erase(nums[i-k]);
        
        } 

        return false;
    }
};