前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一算:Contains Duplicate II

每天一算:Contains Duplicate II

作者头像
五分钟学算法
发布2018-11-20 15:42:56
4560
发布2018-11-20 15:42:56
举报

Contains Duplicate II

leetcode上第219号问题:Contains Duplicate II

给出⼀个整形数组nums和⼀个整数k,是否存在索引i和j,使得nums[i] == nums[j] 且i和j之间的差不超过k Example 1: Input: nums = [1,2,3,1], k = 3 Output: true. Example 2: Input: nums = [1,0,1,1], k = 1 Output: true Example 3: Input: nums = [1,2,3,1,2,3], k = 2 Output: false

思路

考虑用滑动窗口与查找表来解决。

  • 设置查找表record,用来保存每次遍历时插入的元素,record的最大长度为k
  • 遍历数组nums,每次遍历的时候在record查找是否存在相同的元素,如果存在则返回true,遍历结束
  • 如果此次遍历在record未查找到,则将该元素插入到record中,而后查看record的长度是否为k + 1
  • 如果此时record的长度是否为k + 1,则删减record的元素,该元素的值为nums[i - k]
  • 如果遍历完整个数组nums未查找到则返回false
动画演示

动画演示

代码
 1// 219. Contains Duplicate II
 2// https://leetcode.com/problems/contains-duplicate-ii/description/
 3// 时间复杂度: O(n)
 4// 空间复杂度: O(k)
 5class Solution {
 6public:
 7    bool containsNearbyDuplicate(vector<int>& nums, int k) {
 8
 9        if(nums.size() <= 1)  return false;
10
11        if(k <= 0)  return false;
12
13
14        unordered_set<int> record;
15        for(int i = 0 ; i < nums.size() ; i ++){
16
17            if(record.find(nums[i]) != record.end()){
18                return true;
19            }
20
21            record.insert(nums[i]);
22
23            // 保持record中最多有k个元素
24            // 因为在下一次循环中会添加一个新元素,使得总共考虑k+1个元素
25            if(record.size() == k + 1){
26                record.erase(nums[i - k]);
27            }
28        }
29
30        return false;
31    }
32};
执行结果

执行结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • 动画演示
  • 代码
  • 执行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档