题意:
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
提示:
1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
0 <= k <= 10^5
题目来源: https://leetcode.cn/problems/contains-duplicate-ii/description/
解题方法:
一:暴力循环,运行会超出时间限制(不可取)
/*** @param Integer[] $nums* @param Integer $k* @return Boolean*/
//超出时间限制
function containsNearbyDuplicate($nums, $k) {for($i = 0; $i < count($nums); $i++){for($j = $i + 1; $j < count($nums); $j++){if($nums[$i] == $nums[$j] && (abs($i-$j) <= $k)){return true;}}}return false;
}
方法二:解题思路 >>>> 类似hash,开辟一个临时数组,存储不重复的val,当有临时数组中存在该val时,做相关判断,如果符合条件,直接返回,如果不符合,则将该val的key替换为最新key
function containsNearbyDuplicate($nums, $k) {$temp = [];foreach($nums as $key => $value){if(isset($temp[$value]) && abs($key - $temp[$value]) <= $k){return true;}$temp[$value] = $key;}return false;
}
以 $nums =[1,2,3,1,2,3]; $k =2;
为例
前三个为123,当轮到第4元素(第二次出现的1时),此时的索引差值不满足小于2的条件,已经不可能再有比这个小的差值了,所以替换到最新的位置
参考:
作者:xiaoxie
链接:https://leetcode.cn/problems/contains-duplicate-ii/solutions/1059994/phpjie-ti-by-xiaoxie-w-yaum/
来源:力扣(LeetCode)