算法小知识-------01.20-------存在重复元素II

135 阅读1分钟

这是我参与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;
    }

image.png

彩蛋

最近凑巧了解到两种比较有意思的排序方式

  • 猴子排序,理论上就是一直随机,直到结果排序成功为止。
    • 但是因为当今计算机的随机算法都是伪随机(除非是量子计算机),所以相对实用性几乎没有。
    • 最终的答案就是只要你愿意等足够久的时间,最终一定能得到有序序列
  • 睡眠排序,理论就是把序列的每个数都抽离出来定义为相对应的线程,并且把线程sleep对应的数值时间;再重新定义一个新序列,长度为原序列长度,每有一个线程被唤醒则add进新的序列。最终导致序列又序。

感觉奇奇怪怪的排序知识又得到了增长