diff --git a/src/main/java/com/cool/ling_cha_mount/binary_search/RangeFreqQuery.java b/src/main/java/com/cool/ling_cha_mount/binary_search/RangeFreqQuery.java new file mode 100644 index 0000000..8f9defd --- /dev/null +++ b/src/main/java/com/cool/ling_cha_mount/binary_search/RangeFreqQuery.java @@ -0,0 +1,39 @@ +package com.cool.ling_cha_mount.binary_search; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RangeFreqQuery { + + private final Map> map = new HashMap<>(); + + public RangeFreqQuery(int[] arr) { + for (int i = 0; i < arr.length; i++) { + map.computeIfAbsent(arr[i], k -> new ArrayList<>()).add(i); + } + } + + public int query(int left, int right, int value) { + List list = map.get(value); + if (list == null) { + return 0; + } + return binarySearch(list, right + 1) - binarySearch(list, left); + } + + private int binarySearch(List list, int target) { + int left = 0; + int right = list.size() - 1; + while (left <= right) { + int mid = (right - left) / 2 + left; + if (list.get(mid) >= target) { + right = mid - 1; + } else { + left = mid + 1; + } + } + return left; + } +}