【Leetcode Daily】219存在重复元素II
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:305|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个整型数组和一个整数 K,要求出该整型数组中是否存在这么一对数字,数值相同,下标不同。
思路分享
易得,如果存在这么一组值,那么只需要让每个数字与此前与自己相同数值的比较即可,所以构建一哈希表,保存每个数值的最新下标用于对照即可。
基础的枚举思路可以参考 【Leetcode Daily】1两数之和。
以及,本题是可以采用滑动窗口解决的,毕竟下标之差不大于 K,相当于可以构建长度为 K 的窗口滑动,哈希表只用维护窗口内的数值是否存在即可。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution { |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-04-28
【Leetcode Daily】1297子串的最大出现次数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串,求满足要求的子串中,出现最多的次数。该要求为 1. 内部的字母数量小于 maxLetters;2. 整个字符串的长度在 minSize 和 maxSize 之间(闭区间)。 思路分享 该题的难度在于干扰项 maxSize,由于求子串尽可能多的出现,所以该子串的长度必然越小越好,就是 minSize。 就是定长滑动窗口(【Leetcode Daily】1456定长子串中元音的最大数目),有了个字母数量不大于 maxLetters 的限制,再用哈希统计满足要求字符串出现的次数即可。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617181920212223242526272829class Solution {public: int maxFreq(string s, int maxLetters, int minSize, int maxSize) { vector<int>...

2025-04-23
【Leetcode Daily】1423可获得的最大点数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整型数组和一个数字 k,求按照某种方式下获取卡牌所得的最大点数。该方式为每次只能够取得最左或者最右的卡牌。 思路分享 逆向思路,由于每次拿卡牌只拿两侧,所以中间部分是连续的,可以视为一个定长滑动窗口,只不过是求窗口内的最小和,通过这个数值得到答案。滑动窗口模板沿用【Leetcode Daily】1456定长子串中元音的最大数目 正向思路,穷举所有组合可能。 https://leetcode.cn/problems/maximum-points-you-can-obtain-from-cards/solutions/2551432/liang-chong-fang-fa-ni-xiang-si-wei-zhen-e3gb/ 代码解答(强烈建议自行解答后再看) 逆向 12345678910111213141516171819202122232425class Solution {public: int maxScore(vector<int>& cardPoints,...

2025-04-18
【Leetcode Daily】1343大小为K且平均值大于等于与之的子数组数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组,两个整数 threshold 和 k。k是限定子数组的长度,threshold 是阈值。求这个数组中长度为 k 且平均值大于阈值 threshold 的数目。 注意,在算法题中,子数组默认连续,而子序列默认不连续。 思路分享 定长滑动窗口模板秒了,具体参照 【Leetcode Daily】1456定长子串中元音的最大数目 不过这里的和用 int 也没问题,我估计是因为是大于等于阈值这个条件的关系,大于的情况即使因为整数的小数丢失,也能算做等于情况计入。 代码解答(强烈建议自行解答后再看) 滑动窗口 1234567891011121314151617181920class Solution {public: int numOfSubarrays(vector<int>& arr, int k, int threshold) { int result = 0; int sum = 0; for (int i =...

2025-04-16
【Leetcode Daily】1456定长子串中元音的最大数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串以及一个数字 k,要求找出长度为 k 的子串中元音最高的数字。 思路分享 暴力解法就是遍历左右长度 k 的子串,同时遍历字串内,求得每个子串的元音个数,从而得出最大值。由于两层遍历,复杂度为 O(n^2)。 本题可以采用定长滑动窗口,从而把复杂度降到 O(n)。 所谓的滑动窗口由三个部分组成,加入、更新、退出。具体过程如下 加入,让下标为 i 元素进入窗口,如果 i 小于 k - 1 则重复这一步(重复的目的是初始化一个长为 k-1 的窗口) 更新,更新统计值(最大/最小) 退出,让下标 i-k+1...

2025-04-25
【Leetcode Daily】1652拆炸弹
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整型数组加一个数字 k,按照 k 的值重新生成一个数组,比如 k 为正数,那么数组的每个下标要同时替换为其后面 k 个数之和;k 为附属,则换为其前面 k 个数之和。 思路分享 同时这个关键词说明,各个替换互不影响,正是因此,可以用定长滑动窗口来解决。 嘛,还是简单提一下暴力解法,就是先遍历每一位,按照 k 的情况,对每一位设立循环找前或后的数字之和。由于二重循环,时间复杂度就达到了 O(n^2) 那么滑动窗口解法首先要找到 k 不同情况下,首个窗口的范围。经测试,第一个窗口右侧的坐标在 k 正数时,会设置为 k+1,而 k 为负数时设为 n。而左侧坐标一直是右侧坐标减去 k 即可。(这里的窗口都是左闭右开的)后续窗口都是右移,参照模板即可(【Leetcode...

2025-04-30
【Leetcode Daily】1888使二进制字符串字符交替的最少反转次数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个由 0 和 1 组成的字符串,想把该字符串改造为交替字符串,也就是 0 和 1 交替,但是只能做两个操作,1. 把第一个字符放到最后; 2. 使任意位置字符反转(0和1)。求实现的最少操作二次数。 思路分享 挺绕的,让吃完火锅的脑子转不过来。不过通过滑动窗口能够优雅地解决。 https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/solutions/1/ding-chang-hua-dong-chuang-kou-bian-shi-dqfi2/ 简单说明思路,就是要解决两个问题:如何模拟操作一以及如何模拟操作二。 对于第一个问题,如果真的不断地把第一个字符放最后,也不难,但字符串操作效率不高,通过加倍字符串,然后让窗口直接向后滑动就能模拟每种操作一的情况了。老样子,还是把滑动窗口模板放一下(【Leetcode...
公告
不定时更新,记录所学所想
系列文章