leetcode之Contains Duplicate II 问题

来源:互联网 发布:后缀date域名 编辑:程序博客网 时间:2024/05/22 07:34

问题描述:

Given an array of integers and an integer k, find out whether there are two distinct indicesi andj in the array such that nums[i] = nums[j] and the absolute difference betweeni andj is at most k.(题目的大意为给定一个整数数组和一个整数K,有两个不同的索引所指向的值是相同的,但是这两个索引本身之差不超过k)

问题来源:Contains Duplicate II (具体地址:https://leetcode.com/problems/contains-duplicate-ii/#/description)

思路:本题当然可以采用暴力解决,相信很容易就想到了。

      方法一:首先找到数组中每一对相等的数,然后判断它们的索引之差是否小于等于K,只要找到这样一对就行了,返回的值就是true,否则返回false喽;

      方法二:采用滑动窗口来解决,学过计算机网络的人应该觉得很熟悉吧。没学过也没事,我简单粗暴的讲讲,本题中,窗口里放着一些数值,窗口里能存放的数字是有一定的限度的,不能超过这个值,其次,这个窗口有个前沿有个后沿,可以理解为连个指针p1和p2,假设p1指向前沿,p2指向后沿,刚开始没达到窗口阈值的时候,只动前沿(即指针p1即可),当达到阈值的时候,那就要动p2来动态调整整个窗口了,维持着整个窗口值不变。可能有点晕,下面结合代码讲解一下。

代码:

这段代码里相当于有两个指针限制着整个窗口的容量,一个指向前沿,一个指向后沿,窗口中存放的数一旦i超过k之后,就要删除最早添加进来的数,即nums[i - 1 - k].如果当前值nums[i]添加不进集合set,那么说明这个数已经存在于窗口中了,所以才会加不进去啊。