【力扣周赛】第 113 场双周赛(贪心异或性质换根DP)

news2025/2/27 11:20:10

文章目录

  • 竞赛链接
  • Q1:8039. 使数组成为递增数组的最少右移次数
    • 竞赛时代码——枚举答案
  • Q2:2856. 删除数对后的最小数组长度
    • 竞赛时代码——贪心+优先队列
  • Q3:6988. 统计距离为 k 的点对
    • 竞赛时代码——异或性质+哈希表
  • Q4:100041. 可以到达每一个节点的最少边反转次数
    • 竞赛时代码——换根DP
  • 成绩记录

竞赛链接

https://leetcode.cn/contest/biweekly-contest-113/

Q1:8039. 使数组成为递增数组的最少右移次数

https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array/

在这里插入图片描述

提示:

1 <= nums.length <= 100
1 <= nums[i] <= 100
nums 中的整数互不相同。

竞赛时代码——枚举答案

因为数据范围很小,所以可以从小到大枚举可能的答案。

class Solution {
    public int minimumRightShifts(List<Integer> nums) {
        int n = nums.size();
        // a 是排好序之后的数组,作为标准答案
        int[] a = new int[n];
        for (int i = 0; i < n; ++i) a[i] = nums.get(i);
        Arrays.sort(a);
        // 枚举答案,即枚举右移次数
        for (int x = 0; x < n; ++x) {
            boolean f = true;
            // 检查这个答案下每一位是否移动后相等
            for (int i = 0; i < n; ++i) {
                if (nums.get(i) != a[(i + x) % n]) {
                    f = false;
                    break;
                }
            }
            if (f) return x;
        }
        return -1;
    }
}

Q2:2856. 删除数对后的最小数组长度

https://leetcode.cn/problems/minimum-array-length-after-pair-removals/
在这里插入图片描述

提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
nums 是 非递减 数组。

竞赛时代码——贪心+优先队列

首先贪心地想,能匹配就匹配。
但是对于样例 [2, 3, 5, 4] 来说,2 和 3 匹配之后,5 和 4就不能匹配了。
所以在 2 和 3 匹配之后,当枚举到 5 时,可以使用 5 替换掉 3,重新将 3 放入待匹配队列中。

具体算法如下:


使用两个优先队列维护已经被枚举过的数值。
pq1 维护等待匹配的较小数字,pq2 维护已经匹配过的较大数字。

分情况讨论:

  1. 当前数字比 pq1 中的数字大时,就将 pq1 中最小的数字删除,两者完成配对,当前数字放入 pq2。
  2. 当前 pq1 中没有数字,即前面没有元素等待配对时,将当前数字与 pq2 中最小的数字比较,如果 pq2 中的数字较小,就使用当前数字替换 pq2 中的数字与前面配对,同时 pq2 中这个最小的数字就多余了,将其放入 pq1 中等待后序的匹配。
  3. 当前数字无法处理时,就放入 pq1 等待后面出现更大的数字时删除。
class Solution {
    public int minLengthAfterRemovals(List<Integer> nums) {
        int cnt = 0;    // 记录删除了几个数字
        // pq1记录较小的数字,pq2记录较大的数字
        PriorityQueue<Integer> pq1 = new PriorityQueue<>(), pq2 = new PriorityQueue<>();
        for (int x: nums) {
            // 如果当前数字比之前出现的 还没被删除过的数字 大
            if (!pq1.isEmpty() && x > pq1.peek()) {
                cnt += 2;
                pq1.poll();
                pq2.offer(x);
            } else {
                if (pq1.isEmpty() && !pq2.isEmpty() && x > pq2.peek()) {
                    // 如果较小的数字没有了 且 当前数字比已经删除的较大的数字大,就替换一下,将之前较大的数字放入较小的数字组中
                    pq1.offer(pq2.poll());
                    pq2.offer(x);
                } else pq1.offer(x);
            }
        }
        return nums.size() - cnt;
    }
}

Q3:6988. 统计距离为 k 的点对

https://leetcode.cn/problems/count-pairs-of-points-with-distance-k/
在这里插入图片描述

提示:
2 <= coordinates.length <= 50000
0 <= xi, yi <= 10^6
0 <= k <= 100

竞赛时代码——异或性质+哈希表

可以看到数据范围很怪,是 50000,而 k 的数据范围比较小,是 100。我们可以写一个时间复杂度是 O ( n ∗ k ) O(n * k) O(nk) 的算法。

将已经枚举过的 x 和 y 放入哈希表中。
对于一个新的 x 和 y,他要和另外的坐标匹配之和为 k,最多有 k 中可能,即 —— 0 + k, 1 + (k - 1),2 + (k - 2),… ,k + 0。枚举每种情况即可。

根据异或的性质,有 x ^ (i ^ x) = i, y ^ ((k - i) & y) = k - i,因此与 坐标 (x, y) 可以匹配的坐标是 (i ^ x, (k - i) ^ y),其中 i 的取值范围是 0 ~ k。

class Solution {
    public int countPairs(List<List<Integer>> coordinates, int k) {
        int ans = 0;
        Map<Integer, Map<Integer, Integer>> cnt = new HashMap<>();
        for (List<Integer> c: coordinates) {
            int x = c.get(0), y = c.get(1);
            // 枚举 x 和 y 异或取值分配的所有可能。
            for (int i = 0; i <= k; ++i) {
                ans += cnt.getOrDefault(i ^ x, new HashMap<>()).getOrDefault((k - i) ^ y, 0);
            }
            // 将当前坐标放入哈希表
            if (!cnt.containsKey(x)) cnt.put(x, new HashMap<>());
            cnt.get(x).merge(y, 1, Integer::sum);
        }
        return ans;
    }
}

更多有关异或的题目可见:异或/XOR部分问题汇总

Q4:100041. 可以到达每一个节点的最少边反转次数

在这里插入图片描述

提示:
2 <= n <= 10^5
edges.length == n - 1
edges[i].length == 2
0 <= ui == edges[i][0] < n
0 <= vi == edges[i][1] < n
ui != vi
输入保证如果边是双向边,可以得到一棵树。

竞赛时代码——换根DP

第一次 dfs 求各个节点向下需要的反转次数。
第二次 dfs 求答案。

class Solution {
    List<Integer>[] g;
    Set<Integer>[] t;
    int n;
    // 答案,该节点往下传递反转的数量,
    int[] ans, cnt;
    
    public int[] minEdgeReversals(int n, int[][] edges) {
        this.n = n;
        ans = new int[n];
        cnt = new int[n];
        g = new ArrayList[n];
        t = new HashSet[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        Arrays.setAll(t, e -> new HashSet<>());
        
        for (int[] e: edges) {
            int x = e[0], y = e[1];
            g[x].add(y);
            g[y].add(x);
            t[x].add(y);
        }
        
        dfs1(0, -1);        // 求cnt
        ans[0] = cnt[0];
        dfs2(0, -1);        // 求ans
        
        return ans;
    }
    
    public void dfs1(int x, int fa) {
        for (int y: g[x]) {
            if (y != fa) {
                dfs1(y, x);         // 先求cnt[y]
                if (!t[x].contains(y)) cnt[x]++;    // 如果x不能往y走,就+1
                cnt[x] += cnt[y];   
            }
        }
    }
    
    public void dfs2(int x, int fa) {
        for (int y: g[x]) {
            if (y != fa) {
                ans[y] = ans[x];    // 两者的差别只取决于x和y之间边的情况
                if (t[x].contains(y) && !t[y].contains(x)) ans[y]++;
                else if (!t[x].contains(y) && t[y].contains(x)) ans[y]--;
                dfs2(y, x);
            }
        }
    }
}

更多关于换根DP可见:
【算法】换根DP
【LeetCode每日一题合集】2023.7.10-2023.7.16(dfs & 换根DP)

成绩记录

在这里插入图片描述

靠自己 AK 了!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】Pytorch 系列教程(十):PyTorch数据结构:2、张量操作(Tensor Operations):(4)索引和切片详解

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 1. 数学运算 2. 统计计算 3. 张量变形 4. 索引和切片 使用索引访问单个元素 使用切片访问子集 使用索引和…

超级详细 SQL 优化大全

1、MySQL的基本架构 1&#xff09;MySQL的基础架构图 左边的client可以看成是客户端&#xff0c;客户端有很多&#xff0c;像我们经常你使用的CMD黑窗口&#xff0c;像我们经常用于学习的WorkBench&#xff0c;像企业经常使用的Navicat工具&#xff0c;它们都是一个客户端。右…

基于matlab实现的 BPSK调制AWGN通道未编码数据误码率程序

完整程序&#xff1a; clear; close all; clc; c0; rate1; %Code rate N10000000; %Number of bits for EbNoc0:1:10 %Ratio of bit energy to no…

gRpc_go_dart-1.编写第一个服务

​ 通俗的讲下grpc 简化掉所有复杂的实现,它要求服务端和客户端之间按照protobuf的规范进行数据交换,所以服务端和客户端都不用关心彼此的代码实现,只关心按照protobuf的形式提供数据 为什么是go和dart 技术栈,已经是google的形状了 同时,go客户端和Flutter间本身通过http…

05-Flask-Flask查询路由方式

Flask查询路由方式 前言命令行方式代码实现返回所有路由 前言 本篇来学习下Flask中查询路由的方式 命令行方式 # window 用set linux 用 export set FLASK_APPtest_6_flask运行发方式# 打印所有路由 flask routes代码实现返回所有路由 # -*- coding: utf-8 -*- # Time …

优质医疗机构网站模板源码(含手机端)基于pbootcms开源项目

模板名称&#xff1a; 基于pbootcms的医疗机构网站模板&#xff08;手机端优化&#xff09; 模板介绍&#xff1a; 这是一个使用PbootCMS内核开发的医疗机构网站模板&#xff0c;专为医疗机构和医疗保健类企业设计。该模板具有简洁、简单和易于管理的页面风格&#xff0c;并附…

征战开发板从无到有(三)

接上一篇&#xff0c;翘首已盼的PCB板子做好了&#xff0c;管脚约束信息都在PCB板上体现出来了&#xff0c;很满意&#xff0c;会不会成为爆款呢&#xff0c;嘿嘿&#xff0c;来&#xff0c;先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720&#xff0c;大家可以直…

数据结构---链表(java)

目录 1. 链表 2. 创建Node 3. 增加 4. 获取元素 5. 删除 6. 遍历链表 7. 查找元素是否存在 8. 链栈的实现 9. 链队的实现 1. 链表 数据存放在"Node"结点中 优点&#xff1a;不用考虑扩容和缩容的问题&#xff0c;实现了动态存储数据 缺点&#xff1a;没有…

SQLAlchemy Oracle Database 23c Free 集成之旅

SQLAlchemy & Oracle Database 23c Free 集成之旅 1. SQLAlchemy 是什么2. Oracle Database 23c Free 是什么3. 运行 Oracle Database 23c Free4. 学习 SQLAlchemy 统一教程4-1. 安装依赖库4-2. 建立连接 - 引擎4-3. 使用事务和 DBAPI4-3-1. 获取连接4-3-2. 提交更改4-3-3.…

git git fetch 和 git fetch origin master 的区别

git fetch 第1步 先读取 .git/config 配置 [remote origin]&#xff0c;若 fetch 并没有指定其中一个或多个远程仓库&#xff0c;就会处理所有的远程仓库 [remote “origin”]url gitgithub.com:kaku/testGit.gitfetch refs/heads/:refs/remotes/origin/第2步 git fetch 会…

Python 字符串的常用方法

视频版教程 Python3零基础7天入门实战视频教程 下标索引操作和前面的列表&#xff0c;元组用法一样。 虽然字符串不能被修改&#xff0c;但是返回一个操作过的新字符串&#xff0c;所以方法还不少。 我先学习下常用方法&#xff1b; 1&#xff0c;index(元素)方法&#xff0…

第三篇------Virtual I/O Device (VIRTIO) Version 1.1

上一篇文章链接https://blog.csdn.net/Phoenix_zxk/article/details/132921821 接下来续上 5.9.4 支持的加密服务 以下加密服务已定义&#xff1a; /* CIPHER 服务&#xff1a;用于加密解密操作 */ #define VIRTIO_CRYPTO_SERVICE_CIPHER 0 /* HASH 服务&#xff1a;用于哈…

【微信小程序】网络请求

环境&#xff1a;微信小程序开发工具 测试api&#xff08;随机获取猫咪靓照&#xff09;:https://api.thecatapi.com/v1/images/search?limit2 示例&#xff1a; 完整代码 request.wxml <button bind:tap"requestBtn" type"primary">网络请求&l…

基于SSM+Vue的校园活动管理平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【python之经验模态分解EMD实现】PyEMD库的安装和导入EMD, Visualisation问题解决方法[完整可运行]

现有的导入问题 目前网上的办法&#xff0c;直接导入&#xff1a;from PyEMD import EMD, Visualisation 是有问题的 可能会出现 在 ‘init.py | init.py’ 中找不到引用 ‘Visualisation’ 的报错。 原因似乎是现在导入的命令改了&#xff0c;这是一个坑&#xff0c;解决的…

数组相关面试题

1、原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N),空间复杂度为O(1)。 OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 法1&#xff1a;挪到数据&#xff0c;思路如顺序表的头删&#xff0c;将后面的数据向前挪动将…

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

网络安全进阶学习第十九课——CTF之密码学

文章目录 一、密码学简介二、密码设计的根本目标三、古典密码1、摩斯密码CTF-题目展示 2、换位密码1&#xff09;栅栏密码2&#xff09;凯撒密码3&#xff09;曲路密码4&#xff09;列移位密码 3、替换密码1&#xff09;移位密码2&#xff09;简单替换密码3&#xff09;埃特巴什…

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生&#xff0c;纯搞视觉多少还是有点与专业脱节&#xff0c;决定入坑嵌入式。选择STM32进行入门&#xff0c;并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境&#xff08;大一的时候玩过一段时间&#xff0c;但是没什么技术&#…

java创建excel文件和解析excel文件

创建excel文件 package com.bjpowernode.crm.poi;import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.…