zoukankan      html  css  js  c++  java
  • (数组,哈希表) 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;
        }
    };

    注意:是数组中有重复的元素返回true,没有返回false。

    class Solution {
    public:
        bool containsDuplicate(vector<int>& nums) {
            unordered_map<int, int> mp;
            for(int a: nums){
                if(mp.find(a)==mp.end()){
                    //没找到重复元素
                    mp[a] +=1;
                }
                else
                    return true;
            }
            return false;
        }
    };

    用set运行的更快。

    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;
        }
    };
  • 相关阅读:
    mysql编码和Java编码相应一览表
    Swift开发之 使用系统的TabbarController
    Shiro Quartz之Junit測试Session管理
    爱加密Android APk 原理解析
    【机器学习基础】自适应提升
    select默认选择的实现方法
    怎样找对还有一半--第一章 品行与择偶关系
    一步步教你怎样自己主动部署博客
    HTML5的新特性
    DataTables Table plug-in for jQuery
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10166402.html
Copyright © 2011-2022 走看看