• 【leetcode】219 Contains Duplicate2


    题目说明

    https://leetcode-cn.com/problems/contains-duplicate-ii/description/
    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

    解法1

    /*
     * 时间复杂度:O(n)
     * 使用unordered_set保存滑动窗口(长度[0,k])
     */
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_set<int> set1;
    
        for(int i = 0; i <nums.size(); i ++)
        {
            //有重复则返回
            if (set1.find(nums[i]) != set1.end())
                return true;
            //无重复则保存到set
            set1.insert(nums[i]);
            //set长度大于k,则需要移除前方的
            if (set1.size() > k){
                set1.erase(nums[i - k]);
            }
        }
        return false;
    }
    

    解法2

    /*
     * 时间复杂度:O(n)
     * 使用unordered_map保存数组值,以及对应的下标容器
     */
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int,vector<int>> map1;
    
        for (int i = 0; i < nums.size(); i ++) {
            map1[nums[i]].push_back(i);
        }
    
        for (unordered_map<int,vector<int>>::iterator iter = map1.begin(); iter != map1.end(); iter ++) {
            if (iter->second.size() >=2){
                //对容器进行排序
                sort(iter->second.begin(), iter->second.end());
                //遍历容器
                for (int i = 0; i < iter->second.size() - 1; i ++) {
                    //若相邻的下标小于k,则满足条件
                    if (iter->second[i+1] - iter->second[i] <= k )
                        return true;
                }
            }
        }
        return false;
    }
    

    解法3

    /*
     * 时间复杂度:O(n)
     * 使用unordered_map保存数组值,以及对应的下标(最后匹配的下标)
     */
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int,int> map1;
    
        for (int i = 0; i < nums.size(); i ++) {
            auto temp = map1.find(nums[i]);
            if (temp != map1.end()){
                if (i - temp->second <= k)
                    return true;
            }
            map1[nums[i]]=i;
        }
    
        return false;
    }
  • 相关阅读:
    React初识整理(二)--生命周期的方法
    React初识整理(一)
    前后端分离浅析
    url地址数据参数转化JSON对象(js三种方法实现)
    js和JQuery中的获取宽、高、位置等方法整理
    游民轮播图效果实现
    焦点轮播图效果实现
    iOS开发debug集锦
    实现一个 RESTful API 服务器
    从iOS的图片圆角想到渲染
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/9537767.html
Copyright © 2020-2023  润新知