#leedcode219. 存在重复元素 II

leedcode219. 存在重复元素 II

题目描述

在这里插入图片描述

解题过程

1.拿到题目首先考虑了双指针遍历,时间复杂度O(n2) 超时
2.官方解答哈希表思路:
创建一个哈希表(map与unordered_map的区别
遍历数组nums,如果在哈希表中找到了nums[i],并且此时的i和哈希表中的差值小于k,就return true。

核心代码

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
  unordered_map<int,int> st;
  int n=nums.size();
  int num=0;
  for(int i=0;i<n;i++){
      num=nums[i];
      if(st.count(num)&&i-st[num]<=k){
      return true;
      }
      st[num]=i;
  }
  return false;
    }
};

函数积累,count VS find

在哈希表中找某个数
st.count(num);
如果找到了则是1,没找到是0;
对比find
find(num)找的是下标,没找着的话返回的是st.end().

代码反思

第一遍做的时候想用双指针,但是写的时候才意识到可能要超时
审题,小于等于k,应该考虑滑动窗口

map 与unordered_map

关键词记忆:有序和无序

由于底层实现方式不同 ,map是红黑树,unordered_map是哈希桶

所以 map是有序,更适用于,按序输出,或者是找最大最小(有序遍历之类的咱就是性能好)

哈希表更适用于 快速查找键值对,计算某个出现了几次(咱就是快)

因为map在插入和删除是 需要维持红黑树的平衡

空间利用率:map比unordered_map好

迭代器:map按红黑树中序遍历进行操作 双向++/-- unordered_map按逐个桶往后遍历 单向++(后续继续学习)

ACM模式完整代码

#include <iostream>
#include<string>
#include<vector>
#include <unordered_map>
using namespace std;
int main()
{
    vector<int> nums;
    int k;
    int num;
    while (cin >> num) {
        nums.push_back(num);
        if (cin.get() == '\n')
            break;
    }
    cin >> k;
    unordered_map<int,int> st;
    int n = nums.size();
   
    for (int i = 0; i < n; i++) {
        num = nums[i];
        if (st.count(num) && i - st[num] <= k) {
            cout<<"true";
        }
        st[num] = i;
    }
    cout<<"false";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值