2019-11-05 吴亲库里 库里的深夜食堂
给定一个整形数组以及一个整形k,查找在数组中是否存在下标i和j满意$nums[$i]==$nums[$j] 并且他们之间下标差不大于k。

如果是用暴力破解法的话两个for循环在第二层循环体中判断是可以的,但是会超时,所以不行。我们需要在O(n)的时间内完成。那么我们可以维护一个数组,如果数组中不存在当前值,就直接push进数组。这个数组的长度最多只能是k,一旦超过就说明即使后面有值和数组中第一个数相等,他们的距离差肯定大于k。所以一旦长度超过,直接从数组中删除掉第一个数。只要数组存在这个值,那么就可以直接返回true。
/**
* @param Integer[] $nums
* @param Integer $k
* @return Boolean
*/
function containsNearbyDuplicate($nums, $k) {
$data=[];
for($i=0;$i<count($nums);$i++){
if(in_array($nums[$i],$data)) return true;
$data[]=$nums[$i];
if(count($data)>$k){
array_shift($data);
}
}
return false;
}
