news 2026/5/10 1:55:31

每日一题 5.9

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每日一题 5.9

2080 区间内查询数字的频率


思路:首先理解题目,要我们写一个数据结构,也就是一个自定义类,需要有对应的元素,以及构造方法,还有一个公共方法query,用来求频次

一开始,我是将传入的数组再用一个数组来维护,我想的是再query函数里将我们的数组通过left和right进行切片,然后对切片数组进行排序,再将这个排序后的数组以及传过来的value进行二分查找,得到最左value位置,再查value+1,得到右边界,最后二者相减,即可得到结果,但是这样的解法会有用例超时

代码:

class RangeFreqQuery { private final int[] query; public RangeFreqQuery(int[] arr) { this.query = arr; } public int query(int left, int right, int value) { int[] nums = new int [right - left + 1]; for(int i = 0;i<nums.length;i++){ nums[i] = query[left + i]; } Arrays.sort(nums); int S = find(value,nums); int B = find(value+1,nums); return B - S; } private int find(int target,int[] nums){ int left = 0; int right = nums.length - 1; while(left <= right){ int mid = left + (right - left)/2; if(nums[mid] >= target){ right = mid - 1; }else{ left = mid + 1; } } return left; } }

后面呢,也是看了灵神(灵茶山艾府)的题解,了解到优化的思路,构造这个数据结构时,我们可以将传过来的数组的元素加入一个map中,键是元素的值,值就是这个元素在原数组中的下标列表,这样呢,还可以保证我们的这个下标列表是有序的,此时我们有了目标元素对应的下标列表,我们的问题就转化为求目标值对应的下标列表中有多少元素在[left,right]中,我们就可以通过比较左右边界在列表中的位置,再计算得到符合要求的元素数量

具体操作:通过调用query时传的value去获取对应的下标列表,如果列表为空就直接返回0,那么我们就可以分别对传过来的两个边界与我们的下标列表进行二分查找,得到相对应在列表中的下标,最后将二者相减即可,这里要注意,我们对右边界的求值传的目标值应该是right+1,这样才能将两者的返回值直接相减,如果left比所有的元素都大,那两者得到的都是列表的长度,相减就是0,依然是正确的,反之同理

代码:

class RangeFreqQuery { private final Map<Integer,List<Integer>> 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<Integer> a = pos.get(value); if(a == null){ return 0; } return find(a,right + 1) - find(a,left); } private int find(List<Integer> a,int target){ int left = 0; int right = a.size() - 1; while(left<=right){ int mid = left + (right - left)/2; if(a.get(mid) >= target){ right = mid - 1; }else{ left = mid + 1; } } return left; } }

对于pos.computeIfAbsent(arr[i],k->newArrayList<>()).add(i);

这句的作用就是,当arr[i]这个数字是第一次被添加到map中的时候,新建一个空列表去承接他的下标,无论键是第几次出现方法最终会返回这个列表对象(如果是第一次就返回空列表),然后拿这个对象去.add,也就是添加元素

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 1:52:32

CUDA算法优化实战:从内存访问到指令级性能提升全解析

1. 项目概述&#xff1a;从算法到硬件的性能优化之旅 “BBuf/how-to-optim-algorithm-in-cuda”这个项目标题&#xff0c;对于任何一个在CUDA高性能计算领域摸爬滚打过的人来说&#xff0c;都像是一份直指核心的“战书”。它不是一个简单的代码仓库&#xff0c;而是一个系统性的…

作者头像 李华
网站建设 2026/5/10 1:52:31

Ollama MCP Server:为AI助手扩展本地大模型能力的开源桥梁

1. 项目概述&#xff1a;Ollama MCP Server&#xff0c;为你的AI助手注入本地大模型之力 如果你和我一样&#xff0c;日常重度依赖Claude Desktop、Cursor或者Windsurf这类AI编程助手&#xff0c;那你肯定也遇到过它们的“知识边界”问题。有时候你需要它帮你分析一段本地代码…

作者头像 李华
网站建设 2026/5/10 1:49:33

图片元数据修改软件

链接&#xff1a;https://pan.quark.cn/s/501400393eba找了半天没找到比较合适的图片元数据修改软件&#xff0c;用AI搓了一个&#xff0c;用着还行&#xff0c;分享出来给有需要的人&#xff0c;之前发原创给删除了可以检测一些常见AI图的原始数据并给出提示

作者头像 李华
网站建设 2026/5/10 1:49:31

从if-else到插件化:构建可扩展的技能路由框架实践

1. 项目概述&#xff1a;一个技能路由器的诞生最近在折腾一些自动化流程和智能助手应用时&#xff0c;我遇到了一个挺有意思的问题&#xff1a;如何让一个系统能根据用户的输入&#xff0c;智能地调用不同的“技能”或“功能模块”&#xff1f;比如&#xff0c;用户说“查一下天…

作者头像 李华
网站建设 2026/5/10 1:44:31

大路灯什么品牌好用又亮?揭秘护眼大路灯综合榜十强,优质健康光

护眼大路灯靠着良好的灯光效果&#xff0c;能够帮助我们改善光线室内用眼光线的同时&#xff0c;减少不良光线引起的视觉疲劳、近视风险等&#xff0c;但说实话&#xff0c;现在市面上有不少性能欠佳的劣质护眼大路灯&#xff0c;所以我们在选购护眼大路灯时一定要优选专业技术…

作者头像 李华
网站建设 2026/5/10 1:44:30

拿PMP证书到底值不值?从薪资影响看清晖这类机构的价值

不少想考PMP的人最先问的不是考试难不难&#xff0c;而是“拿证后能涨多少工资”。要回答这个问题&#xff0c;得先理清PMP对薪资的真实影响&#xff0c;再看像清晖这类专业培训机构能帮你避开哪些弯路——毕竟考证的最终目的&#xff0c;还是要落到职业回报上。先搞懂&#xf…

作者头像 李华