leetcode 219.存在重复元素

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

这个就会有限制了,一旦有限制,充分利用起来,可以降低复杂度。

暴力法:针对每一个元素,向前或者向后k个截止,是个人就会想出来,我不想这么做。

那么往深了想?之前的解决办法是用哈希表,这样堆叠复杂度会上升,题解呢也是老三套,证明并没有好的解决方法。

用哈希表最简单了。再者说,什么是哈希表就不是好思想了?
 

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        map<int, vector<int> > m;
        for(int i=0; i<nums.size(); i++){ // 从头到尾插入进去
            if(m.find(nums[i]) != m.end()){ // 证明之前就有这个数字
                for(int j=0; j<m[nums[i]].size(); j++){ // 就开始比较是否
                    if(abs(m[nums[i]][j])-i<=k){
                        return true;
                    } 
                }
                // 如果都大于k,那么就添加进去,进行下一个
                m[nums[i]].push_back(i);
            }
            else{ // 证明不存在
                vector<int> v;
                v.push_back(i);
                m[nums[i]] = v;
            }
        }
        return false;
    }
};
发布了147 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/HeroIsUseless/article/details/104124603
今日推荐