zoukankan      html  css  js  c++  java
  • LeetCode 697. 数组的度

    https://leetcode-cn.com/problems/degree-of-an-array/

    这个题跟昨天做的子串很相似哈,哈希表+滑动窗口完成。

    class Solution {
        public int findShortestSubArray(int[] nums) {
           HashMap<Integer, Integer> map = new HashMap<>();
            int max = Integer.MIN_VALUE;
            for (int num : nums) {
                map.put(num, map.getOrDefault(num, 0) + 1);
                max = Math.max(max,map.get(num));
            }
            HashMap<Integer,Integer> cur = new HashMap<>();
            int fast = 0;
            int slow = 0;
            int min = Integer.MAX_VALUE;
            while(fast < nums.length){
                cur.put(nums[fast],cur.getOrDefault(nums[fast],0)+1);
                while(cur.get(nums[fast]).equals(max)){
                    min = Math.min(min,fast - slow + 1);
                    cur.put(nums[slow],cur.get(nums[slow])-1);
                    slow++;
                }
                fast++;
            }
            return min;
        }
    }

    思路就是先把原来的数组的度找出来,就是出现最多的元素的次数,然后就进入滑动窗口,快指针一直访问到当前度数与原数组的度相等,就开始缩小左边界,直到度不再满足条件,这个做出来要29ms,只击败了50%的人。

    后来看了看题目给的条件,数组长度最长是已知的,那么我们就不需要去用map统计长度了,直接开数组就完事。

    class Solution {
        public int findShortestSubArray(int[] nums) {
            int[] count = new int[50000];
            int max = Integer.MIN_VALUE;
            for (int num : nums) {
                count[num]++;
                max = Math.max(max,count[num]);
            }
            HashMap<Integer,Integer> cur = new HashMap<>();
            int fast = 0;
            int slow = 0;
            int min = Integer.MAX_VALUE;
            while(fast < nums.length){
                cur.put(nums[fast],cur.getOrDefault(nums[fast],0)+1);
                while(cur.get(nums[fast]).equals(max)){
                    min = Math.min(min,fast - slow + 1);
                    cur.put(nums[slow],cur.get(nums[slow])-1);
                    slow++;
                }
                fast++;
            }
            return min;
        }
    }

    这次做完只需要19ms,击败87%的人

  • 相关阅读:
    ZIP压缩算法详细分析及解压实例解释
    nyoj 269 VF
    骨牌覆盖问题 KxM
    骨牌覆盖问题
    省赛总结...
    归并排序求逆序对
    「JLOI2014」松鼠的新家
    「JSOI2011」任务调度
    「JSOI2010」找零钱的洁癖
    「JSOI2011」棒棒糖
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/12950268.html
Copyright © 2011-2022 走看看