From 0683d87b58de8566f23a1449c7a0ddf229da106b Mon Sep 17 00:00:00 2001 From: Cool <747682928@qq.com> Date: Sun, 17 Nov 2024 17:27:30 +0800 Subject: [PATCH] =?UTF-8?q?2024/11/17=20=E7=81=B5=E8=8C=B6=E9=A2=98?= =?UTF-8?q?=E5=8D=95=20=E4=BA=8C=E5=88=86=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binary_search/RangeFreqQuery.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/com/cool/ling_cha_mount/binary_search/RangeFreqQuery.java 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; + } +}