• LeetCode 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

    示例 2:

    输入:nums = [1,0,1,1], k = 1
    输出:true

    示例 3:

    输入:nums = [1,2,3,1,2,3], k = 2
    输出:false
    哈希表 和滑动窗口
    • 方法一

      /**
       * 哈希
       *
       * @param nums
       * @param k
       * @return
       */
      public static boolean containsNearbyDuplicate1(int[] nums, int k) {
          if (nums == null) {
              return false;
          }
      
          // 保存每个元素出现的位置
          Map<Integer, List<Integer>> integers = new HashMap<>();
          for (int i = 0; i < nums.length; i++) {
              int tmp = nums[i];
              // 当前元素如果重复出现,判断之前出现的下标位置是否和当前位置的距离超过k
              List<Integer> integerList = integers.getOrDefault(tmp, new ArrayList<>());
              for (int j = 0; j < integerList.size(); j++) {
                  // 判断是否出现满足条件的元素
                  if (i - integerList.get(j) <= k) {
                      return true;
                  }
              }
              // 没有出现则需要将当前位置加入到当前元素的位置链表中
              integerList.add(i);
              integers.put(tmp, integerList);
          }
          return false;
      }
      
    • 方法二

      /**
       * 滑动窗口
       *
       * @param nums
       * @param k
       * @return
       */
      public static boolean containsNearbyDuplicate02(int[] nums, int k) {
          if (nums == null) {
              return false;
          }
      
          for (int i = 0; i < nums.length - 1; i++) {
              for (int j = i + 1; j < nums.length && j <= i + k; j++) {
                  if (nums[i] == nums[j]) {
                      return true;
                  }
              }
          }
          return false;
      }
      
    • 方法三

    /**
     * 滑动窗口+ 哈希
     *
     * @param nums
     * @param k
     * @return
     */
    public static boolean containsNearbyDuplicate(int[] nums, int k) {
        if (nums == null) {
            return false;
        }
    
        Set<Integer> integerSet = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if (i > k) {
                integerSet.remove(nums[i - k - 1]);
            }
            if (integerSet.contains(nums[i])) {
                return true;
            }
            integerSet.add(nums[i]);
        }
        return false;
    }
    
    测试用例
    public static void main(String[] args) {
        int[] nums = new int[]{1, 2, 3, 1};
        int k = 3;
        boolean flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
        System.out.println("ContainsNearbyDuplicate demo01 result : " + flag);
    
        nums = new int[]{1, 0, 1, 1};
        k = 1;
        flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
        System.out.println("ContainsNearbyDuplicate demo02 result : " + flag);
    
        nums = new int[]{1, 2, 3, 1, 2, 3};
        k = 2;
        flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
        System.out.println("ContainsNearbyDuplicate demo03 result : " + flag);
    
        nums = new int[]{2, 2};
        k = 3;
        flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
        System.out.println("ContainsNearbyDuplicate demo04 result : " + flag);
    }
    
    测试结果
    ContainsNearbyDuplicate demo01 result : true
    ContainsNearbyDuplicate demo02 result : true
    ContainsNearbyDuplicate demo03 result : false
    ContainsNearbyDuplicate demo04 result : true
    
  • 相关阅读:
    用DllImport引用的外部DLL文件如何通过clickonce发布
    关于Response.Redirect 端口不一致的跳转
    c# 使用递归 循环遍历导航树结构 并解析
    .net判断用户使用的是移动设备还是PC
    Lucene.net 从创建索引到搜索的代码范例
    C#敏感关键词过滤代码
    对SQL Server SQL语句进行优化的10个原则
    SQL Server表分区
    asp.net 真正实现完全跨域单点登录
    ASP.NET性能优化小结
  • 原文地址:https://www.cnblogs.com/fyusac/p/15823723.html
Copyright © 2020-2023  润新知