Leetcode - 131双周赛

一,3158. 求出出现两次数字的 XOR 值

 本题是一道纯模拟题,直接暴力。

代码如下: 

class Solution {
    public int duplicateNumbersXOR(int[] nums) {
        int ans = 0;
        long t = 0;
        for(int x : nums){
            if(((t>>x)&1) == 1){
                ans ^= x;
            }else{
                t |= (1L<<x);
            }
        }
        return ans;
    }
}

二,3159. 查询数组中元素的出现位置

本题也是一道模拟题,可以先用一个集合记录nums数组中 x 出现的下标,再枚举queries数组,如果queries[i]大于集合的大小(即数组中x出现的次数小于queries[i]),返回-1;否则放回下标。

代码如下: 

class Solution {
    public int[] occurrencesOfElement(int[] nums, int[] queries, int x) {
        List<Integer> lst = new ArrayList<>();
        for(int i=0; i<nums.length; i++){
            if(nums[i] == x){
                lst.add(i);
            }
        }
        int[] ans = new int[queries.length];
        int i = 0;
        for(int q : queries){
            ans[i++] = lst.size() >= q ? lst.get(q-1) : -1; 
        }
        return ans;
    }
}

三,3160. 所有球里面不同颜色的数目

本题求每次操作后,不同颜色的数目,可以使用两个哈希表m1、m2,m1存储<i,i 的颜色>,m2存储<i 的颜色,该颜色的出现次数>。

接下来就是分情况讨论,当把球 x 的颜色改成 y 时:

  • 如果 x 没有在之前出现过(即 m1.containsKey(x) == false),直接将<x,y>放入m1,将m2中的 y 颜色加1
  • 如果 x 在之前出现过(即 m1.containsKey(x) == true),我们需要先将之前 x 对应的  z 颜色(即m1.get(x))的数目减一,如果减完之后 z 颜色的数量为 0,需要去除 z 颜色;如果不为0,就不去除。最后将<x,y>放入m1,将m2中的 y 颜色加1
  • 完成一次上述操作后,ans[i] = m2.size()

 代码如下:

class Solution {
    public int[] queryResults(int limit, int[][] queries) {
        int[] ans = new int[queries.length];
        Map<Integer, Integer> m1 = new HashMap<>();//<i,i的颜色>
        Map<Integer, Integer> m2 = new HashMap<>();//<i的颜色,该颜色出现次数>
        for(int i=0; i<queries.length; i++){
            int[] x = queries[i];
            if(m1.containsKey(x[0]) && m2.merge(m1.get(x[0]), -1, Integer::sum)==0){
                m2.remove(m1.get(x[0]));
            }
            m1.put(x[0], x[1]);
            m2.merge(x[1], 1, Integer::sum);
            ans[i] = m2.size();
        }
        return ans;
    }
}

四,3161. 物块放置查询

由题目可知,我们需要一个数据结构来动态维护一个区域内的最大可放置的物块大小。满足以上条件的数据结构就是线段树:

  • 如何进行点更新(update)?
  • 假设我们要在 x 处放一个障碍物,pre 是 x 前一个障碍物,就需要更新以 x 为右端点时可以放置的最大物块,更新为 x - pre;nxt 是 x 后一个障碍物,同时我们还需要更新以 nxt 为右端点时可以放置的最大物块,更新为 nxt - x。
  • 如何查询(query)?
  • 我们查询的右端点有两种情况:1、刚好在障碍物上,直接查询[0,q[1]] 这块区域的最大值;2、不在障碍物上,那么就需要分成两段来求:一段是[0,pre]的最大值,另一段直接求就是 x - pre
class Solution {
    int[] t;
    //[l, r]表示当前的范围,i表示数组t存储[l,r]的最大值的下标
    //jobr表示要更新端点,val表示更新的值
    void update(int l, int r, int i, int jobr, int val){
        if(l == r){
            t[i] = val;
            return;
        } 
        int mid = (l + r) / 2;
        if(jobr <= mid){
            update(l, mid, i<<1, jobr, val);
        }else{
            update(mid+1, r, i<<1|1, jobr, val);
        }
        t[i] = Math.max(t[i<<1], t[i<<1|1]);
    }
    //[l, r]表示当前的范围,i表示数组t存储[l,r]的最大值的下标
    //[0, jobr]表示要查询的区域
    public int query(int l, int r, int i, int jobr){
        if( r <= jobr){
            return t[i];
        }
        int mid = (l + r) / 2;
        if(jobr <= mid) 
            return query(l, mid, i<<1, jobr);
        else
            return Math.max(t[i<<1],query(mid+1, r, i<<1|1, jobr));
    }
    public List<Boolean> getResults(int[][] queries) {
        int m = 0;
        for(int[] q : queries) m = Math.max(m, q[1]);
        m++;
        t = new int[m << 2];
        TreeSet<Integer> set = new TreeSet<>();//求相邻的障碍物的位置
        set.add(0);
        set.add(m);
        List<Boolean> ans = new ArrayList<>();
        for(int[] q : queries){
            int x = q[1];
            int pre = set.floor(x-1);//求x前的障碍物
            if(q[0] == 1){
                int nxt = set.ceiling(x);//求x后的障碍物
                set.add(x);
                update(0, m, 1, x, x-pre);//更新[0,x]的最大可放置的物品大小
                update(0, m, 1, nxt, nxt-x);//更新[0,nxt]的最大可放置的物品大小
            }else{
                int mx = Math.max(query(0, m, 1, pre), x - pre);//分成两段求最大值
                ans.add(mx >= q[2]);
            }   
        }
        return ans;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度神经网络——什么是迁移学习?

1.概述 在练习机器学习时&#xff0c;训练模型可能需要很长时间。从头开始创建模型架构、训练模型&#xff0c;然后调整模型需要大量的时间和精力。训练机器学习模型的一种更有效的方法是使用已经定义的架构&#xff0c;可能具有已经计算出的权重。这是背后的主要思想 迁移学习…

适合多种苛刻环境的惯性测量单元M-G370PDS

全球IMU市场d在汽车和机器人技术进步和不断增长的应用需求&#xff0c;保持着高速增长的趋势&#xff0c;其中航空航天、国防和汽车等行业对高精度、稳定和紧凑的IMU需求尤为强烈&#xff0c;这些行业对精度和可靠性的高要求直接影响了相关技术的发展方向。 爱普生惯性测量单…

现场辩论赛活动策划方案

活动目的&#xff1a; 技能竞赛中的辩论环节既可以考核员工的知识点&#xff0c;同时也可以考核员工业务办事能力&#xff0c;表达能力&#xff0c;是一种比较全面且较有深度的竞赛方式。 辩论赛细则&#xff1a; 1、时间提示 : 自由辩论阶段&#xff0c;每方使用时间剩…

如何将md文件精确的转换成docx文件

如何将md文件转换成docx&#xff1f; 文章目录 如何将md文件转换成docx&#xff1f;一、如何将MD文件比较完美的转换成word呢&#xff1f;二、方法3 步骤1、下载一个可用的MarkDown编辑器2、下载Pandoc安装 三、来进行转化了 一、如何将MD文件比较完美的转换成word呢&#xff1…

基于51单片机智能蓝牙台灯

基于51单片机智能蓝牙台灯 &#xff08;仿真&#xff0b;程序&#xff0b;原理图PCB&#xff09; 功能介绍 具体功能&#xff1a; 1.分为手动/自动两种模式&#xff0c;自动模式下对应LED指示灯亮&#xff1b; 2.手动模式下&#xff0c;可用按键调节亮度&#xff1b; 3.自动…

AI 画图真刺激,手把手教你如何用 ComfyUI 来画出刺激的图

目前 AI 绘画领域的产品非常多&#xff0c;比如 Midjourney、Dalle3、Stability AI 等等&#xff0c;这些产品大体上可以分为两类&#xff1a; 模型与产品深度融合&#xff1a;比如 Midjourney、Dalle3 等等。模型与产品分离&#xff1a;比如 SD Web UI、ComfyUI 等等。 对于…

使用jdk自带jhat工具排查OOM问题

使用jdk自带jhat工具排查OOM问题 OOM java.lang.OutOfMemoryError: Java heap space排查步骤 编写一个测试类 public class TestJVM {Testpublic void test1() throws InstantiationException, IllegalAccessException {List<A> list new ArrayList<>();for (i…

Java开发-面试题-0001-String、StringBuilder、StringBuffer的区别

Java开发-面试题-0001-String、StringBuilder、StringBuffer的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&am…

OLED显示一张图片

1.思路: void Oled_Show_Image(unsigned char *image) // { unsigned char i; //-128 ~ 127位 unsigned int j; //j要重新定义&#xff0c;因为要到达图片的最后一位 //行 i没有问题&#xff0c;j有问题 i为1时&am…

光速进化!易天万兆光模块全面升级

易天光通信宣布10G SFP/25G SFP28系列光模块产品进行了全新升级&#xff0c;旨在为客户提供更优质、更高效、更可靠的光通信解决方案。这次升级不仅是技术的突破&#xff0c;更是对未来光通信发展趋势的深刻洞察和精准把握。 一、技术革新&#xff0c;性能卓越 本次全系列产品…

强化学习——学习笔记3

一、强化学习都有哪些分类&#xff1f; 1、基于模型与不基于模型 根据是否具有环境模型&#xff0c;强化学习算法分为两种&#xff1a;基于模型与不基于模型 基于模型的强化学习(Model-based RL)&#xff1a;可以简单的使用动态规划求解&#xff0c;任务可定义为预测和控制&am…

windows部署ollama+maxkb+vscode插件continue打造本地AI

windows部署ollamamaxkbvscode插件continue打造本地AI 前言下载ollamadocker desktopvscode插件continue 安装安装ollama设置环境变量 安装docker desktop部署maxkb容器 安装vscode插件模型搜索和推荐 前言 我采用docker运行maxkb&#xff0c;本地运行ollama形式。可能是windo…

HTTP报文

HTTP报文 报文流 HTTP报文是在HTTP引用程序之间发送的数据块&#xff0c;这些数据块以一种文本形式的元信息开头&#xff0c;这些信息描述了报文的内容和含义&#xff0c;后面跟着可选的数据部分&#xff0c;这些报文在客户端&#xff0c;服务器和代理之间流动。 报文流入源…

盘点韩语中的四字成语柯桥留学韩语学习外语培训

일석이조 一石二鸟 일거양득 一举两得 호장성세 虚张声势 새옹15857575376#지마 塞翁失马 간담상조 肝胆相照 이심전심 心心相印 동고동락 同甘共苦 외유내강 外柔内刚 입신양명 扬名立万 다다익선 多多益善 거두절미 截头去尾 일사천리 一泻千里 자유자재 自由自在 탁상공

一套saas模式云MES系统源码,基于springboot+vue.js+uniapp开发

一套saas模式云MES系统源码&#xff0c;基于springbootvue.jsuniapp开发 MES系统简介 MES系统&#xff0c;即制造执行系统&#xff08;Manufacturing Execution System&#xff09;&#xff0c;是一种面向制造企业车间执行层的生产信息化管理系统。它位于上层的企业资源规划&a…

浅谈路由器转发数据包

当路由器转发数据包时&#xff0c;它会经历一系列步骤&#xff0c;包括接收数据包、路由表查询、以及转发数据包。以下是详细的步骤描述&#xff1a; 1. 接收数据包 以太网帧到达端口&#xff1a;当一个以太网帧到达路由器的某个网络接口&#xff08;端口&#xff09;时&#…

通过Transformers用不同的采样方法生成文本

近年来&#xff0c;随着以OpenAI的ChatGPT和Meta的LLaMA为代表的基于数百万网页数据训练的大型Transformer语言模型的兴起&#xff0c;开放域语言生成领域吸引了越来越多的关注。开放域中的条件语言生成效果令人印象深刻&#xff0c;典型的例子有&#xff1a;GPT2在独角兽话题上…

Javascript 基础知识 —— 重写数组方法

1、写一个函数&#xff0c;实现深度克隆对象 const obj {name: "LIYUFAN",age: 25,career: "初级前端工程师",info: {field: ["JS", "CSS", "HTML"],framework: ["React", "Vue", "Angular"…

什么是边缘计算网关?工业方向应用有哪些?天拓四方

在数字化时代&#xff0c;信息的传输与处理变得愈发重要&#xff0c;而其中的关键节点之一便是边缘计算网关。这一先进的网络设备&#xff0c;不仅扩展了云端功能至本地边缘设备&#xff0c;还使得边缘设备能够自主、快速地响应本地事件&#xff0c;提供了低延时、低成本、隐私…

2.开发环境介绍

开发环境介绍三种&#xff1a;第一种是在线开发环境、第二种是Windows下的开发环境、第三种是Linux下的开发环境。 1.在线开发环境 2.Windows下的开发环境 用的比较多的是Devc&#xff0c;新手适合使用&#xff0c;上手快&#xff0c;简单&#xff0c;方便。 Devc使用&#x…