数组查询(i-j范围内有多少个target)

简介: 数组查询(i-j范围内有多少个target)

题目

数组为{3, 2, 2, 3, 1},查询为(0, 3, 2)
意思是在数组里下标0~3这个范围上,有几个2?答案返回2。
假设给你一个数组arr,
对这个数组的查询非常频繁,都给出来
请返回所有查询的结果

一、预处理结构

image.png

生成一张表
查1-4范围上有几个1,在这个有序范围上二分就可以了
我要查2~7范围上有几个2,在这个有序上二分就可以了
image.png

怎么二分?
查询在12~53范围上有几个3,就是在这个有序数组中找大于等于12最左的位置,小于等于53左右的位置

二、代码

        public static class QueryBox2 {
        private HashMap<Integer, ArrayList<Integer>> map;

        public QueryBox2(int[] arr) {
            map = new HashMap<>();
            for (int i = 0; i < arr.length; i++) {
                if (!map.containsKey(arr[i])) {
                    map.put(arr[i], new ArrayList<>());
                }
                map.get(arr[i]).add(i);
            }
        }

        public int query(int L, int R, int value) {
            if (!map.containsKey(value)) {
                return 0;
            }
            ArrayList<Integer> indexArr = map.get(value);
            // 查询 < L 的下标有几个
            int a = countLess(indexArr, L);
            // 查询 < R+1 的下标有几个
            int b = countLess(indexArr, R + 1);
            return b - a;
        }

        // 在有序数组arr中,用二分的方法数出<limit的数有几个
        // 也就是用二分法,找到<limit的数中最右的位置
        private int countLess(ArrayList<Integer> arr, int limit) {
            int L = 0;
            int R = arr.size() - 1;
            int mostRight = -1;
            while (L <= R) {
                int mid = L + ((R - L) >> 1);
                if (arr.get(mid) < limit) {
                    mostRight = mid;
                    L = mid + 1;
                } else {
                    R = mid - 1;
                }
            }
            return mostRight + 1;
        }

    }
相关文章
|
网络协议 网络架构
深入理解IP地址、子网掩码、网关的概念
深入理解IP地址、子网掩码、网关的概念
4745 0
深入理解IP地址、子网掩码、网关的概念
|
存储 索引 Python
Python中的列表(List) 详解与高级应用
Python中的列表(List) 详解与高级应用
863 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
互联网时代呼唤‘新中文‘的崛起 - 谈谈象形文字在如今分词方法下面临的挑战
本文探讨了汉字在互联网和大模型时代的挑战与机遇,分析了汉字在创造新词、自然语言处理等方面的局限性,并提出了“新中文”概念,包括二维部首组合法、拼音化与语调简化等创新方法,旨在保留汉字文化精髓的同时,提升其在数字时代的适应性和处理效率。
388 0
|
人工智能 编解码 自然语言处理
prompt提示词
prompt提示词
1212 0
|
网络协议 Shell 网络安全
【非广告】Gitbook 接入 Gitlab Webhook 功能,实现文档实时在线更新(上)
Hello,大家好,我是阿粉,对接文档是每个开发人员不可避免都要写的,友好的文档可以大大的提升工作效率。阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部署了一套实时的,使用起来特方便了。跟着阿粉的步骤,教你部署自己的文档服务。
【非广告】Gitbook 接入 Gitlab Webhook 功能,实现文档实时在线更新(上)
|
机器学习/深度学习 人工智能 Cloud Native
云原生场景中的 AI 任务调度|学习笔记
快速学习云原生场景中的 AI 任务调度。
1071 0
云原生场景中的 AI 任务调度|学习笔记
|
机器学习/深度学习 算法 搜索推荐
SNS是干什么的?底层原理是什么?
SNS是干什么的?底层原理是什么?
855 0
|
SQL 存储 关系型数据库
pycharm中将Excel数据存入mysql数据中
常常很多数据都是我们常用的,但是放在电脑中很容易丢失这些数据,所以我们大多时候都会把数据存入数据库中,进行长时间的保存。同时也能够更方便的使用,这篇文章我们主要讲的就是将Excel表中的数据提取出来存入mysql数据库中,进行储存起来。
pycharm中将Excel数据存入mysql数据中