力扣每日一题【算法学习day.128】

前言

###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.区间内查询数字的频率

题面:2080. 区间内查询数字的频率 - 力扣(LeetCode)

题面:力扣每日一题【算法学习day.128】_第1张图片

分析:缓存每个数字的下标集合,然后通过二分快速算出满足区间的下标个数

附上灵神代码:

class RangeFreqQuery {
    private final Map> pos = new HashMap<>();

    public RangeFreqQuery(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            pos.computeIfAbsent(arr[i], k -> new ArrayList<>()).add(i);
        }
    }

    public int query(int left, int right, int value) {
        List a = pos.get(value);
        if (a == null) {
            return 0;
        }
        // > right 等价于 >= right+1
        return lowerBound(a, right + 1) - lowerBound(a, left);
    }

    // 开区间写法
    // 请看 https://www.bilibili.com/video/BV1AP41137w7/
    private int lowerBound(List a, int target) {
        // 开区间 (left, right)
        int left = -1;
        int right = a.size();
        while (left + 1 < right) { // 区间不为空
            // 循环不变量:
            // a[left] < target
            // a[right] >= target
            int mid = (left + right) >>> 1;
            if (a.get(mid) < target) {
                left = mid; // 范围缩小到 (mid, right)
            } else {
                right = mid; // 范围缩小到 (left, mid)
            }
        }
        return right; // right 是最小的满足 a[right] >= target 的下标
    }
}

后言

共勉力扣每日一题【算法学习day.128】_第2张图片

 

 

你可能感兴趣的:(算法,#,动态规划,leetcode,学习,算法,java)