zoukankan      html  css  js  c++  java
  • 【LeetCode-数组】存在重复元素 II

    题目描述

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

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

    题目链接: https://leetcode-cn.com/problems/contains-duplicate-ii/

    思路

    使用哈希表来做,哈希表的 key 为数组中的元素,value 为元素对应的下标,例如 hash[nums[i]] = i. 算法如下:

    • 遍历数组:
      • 如果当前元素 nums[i] 不在哈希表中,则将当前元素加入到哈希表中,也就是 hash[nums[i]] = i;
      • 如果当前元素 nums[i] 在哈希表中:
        • 如果 i - hash[nums[i]] <= k,则返回 true;
        • 否则,更新 hash[nums[i]] 为 i;(不更新的话类似于[1, 0, 1 , 1, 0], 1 这样的例子会通不过)
    • 返回 false。

    代码如下:

    class Solution {
    public:
        bool containsNearbyDuplicate(vector<int>& nums, int k) {
            if(nums.empty()) return false;
    
            unordered_map<int, int> hash;
            for(int i=0; i<nums.size(); i++){
                if(hash.find(nums[i])!=hash.end()){
                    if(i-hash[nums[i]]<=k) return true;
                    else hash[nums[i]] = i;
                }else{
                    hash[nums[i]] = i;
                }
            }
            return false;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(n)
  • 相关阅读:
    Expert Shell Scripting
    tr [a-z] [A-Z]
    ssh
    scp
    sort 命令
    cut 命令使用
    oracle 对象权限 系统权限 角色权限
    从linux内核中学到的编程技巧 【转】
    2019.3.16 最小生成树之城市改造
    2019.1.23 01迷宫
  • 原文地址:https://www.cnblogs.com/flix/p/12912910.html
Copyright © 2011-2022 走看看