这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战
存在重复元素II
该题出自力扣的219题——存在重复元素II(简单题)
审题
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false。
示例 1:
输入:nums = [1,2,3,1], k = 3 输出:true
-
整合题意,抽离相关重点
- nums[i] == nums[j]
- abs( i - j ) <= k
-
结合 取索引下标的绝对值 <= k ,此处可用滑动窗口,也就是 i > k
-
也可以用暴力解法,毕竟条件都很清晰明朗
编码
- 暴力解法:双重for循环下 + 题目的条件;当然了是死在力扣极端的测试用例之下的,超时了。
public boolean containsNearbyDuplicate(int[] nums, int k) {
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if (nums[i] == nums[j] && Math.abs(i-j) <= k)
return true;
}
}
return false;
}
- 滑动窗口:唯一的坏处应该是空间复制度上来了,因为需要额外定义HashSet
- 循环数组,如果当前下标大于指定K值,则hashset删除窗口左端
- 并且把当前点加入hashSet
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0;i<nums.length;i++){
if (i>k){
hashSet.remove(nums[i-k-1]);
}
if (hashSet.contains(nums[i]))return true;
hashSet.add(nums[i]);
}
return false;
}
彩蛋
最近凑巧了解到两种比较有意思的排序方式
- 猴子排序,理论上就是一直随机,直到结果排序成功为止。
- 但是因为当今计算机的随机算法都是伪随机(除非是量子计算机),所以相对实用性几乎没有。
- 最终的答案就是只要你愿意等足够久的时间,最终一定能得到有序序列
- 睡眠排序,理论就是把序列的每个数都抽离出来定义为相对应的线程,并且把线程sleep对应的数值时间;再重新定义一个新序列,长度为原序列长度,每有一个线程被唤醒则add进新的序列。最终导致序列又序。
感觉奇奇怪怪的排序知识又得到了增长