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)
  • 相关阅读:
    2020.11.17
    2020.11.26
    2020.11.18
    2020.12.01
    2020.11.23
    Java编程规范
    20201003 千锤百炼软工人
    2020081920200825 千锤百炼软工人
    20201004 千锤百炼软工人
    20200929 动手动脑
  • 原文地址:https://www.cnblogs.com/flix/p/12912910.html
Copyright © 2011-2022 走看看