zoukankan      html  css  js  c++  java
  • 【LeetCode】219. Contains Duplicate II

    题目:

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and jis at most k.

    提示:

    此题考察的是对Hash Table的应用。这里给出两种方法,第一种基于unordered_map(HashMap),第二种基于unordered_set(HashSet)。

    代码:

    unordered_map:

    class Solution {
    public:
        bool containsNearbyDuplicate(vector<int>& nums, int k) {
            unordered_map<int, int> unmap;
            for (int i = 0; i < nums.size(); ++i) {
                if (unmap.find(nums[i]) == unmap.end()) {
                    unmap[nums[i]] = i;
                } else {
                    int dis = i - unmap[nums[i]];
                    if (dis <= k) return true;
                    unmap[nums[i]] = i;
                }
            }
            return false;
        }
    };

    核心思想就是将数作为键,将数的位置作为值。若遇到相同的数,比较位置差异。

    下面是基于unordered_set的方法:

    class Solution {
    public:
        bool containsNearbyDuplicate(vector<int>& nums, int k) {
            unordered_set<int> us;
            for (int i = 0; i < nums.size(); i++) {
                if (i > k) us.erase(nums[i-k-1]);
                if (!us.insert(nums[i]).second) return true;
            }
            return false;
        }
    };

    相当于是维护一个大小为k+1的划窗,如果超出了划窗的大小就剔除划窗中的第一个数字。如果在插入新数字时发现已经存在,说明找到了满足要求的数字。

  • 相关阅读:
    UIScrollerView遇到UINavigationController
    iOS 自动化打包
    最最基本的SQL常用命令
    导入样式表与外部样式表的区别
    jdk、jre、JVM的简单区别与联系
    JDBC驱动的四种类型
    将映射中的值进行排序并输出键
    Java优先级队列
    Java线程池
    Callable--创建有返回值的线程
  • 原文地址:https://www.cnblogs.com/jdneo/p/4745464.html
Copyright © 2011-2022 走看看