Leetcode - 周赛418

目录

一,3309. 连接二进制表示可形成的最大数值

二,3310. 移除可疑的方法

三,3311. 构造符合图结构的二维矩阵

四,3312. 查询排序后的最大公约数


一,3309. 连接二进制表示可形成的最大数值

本题数据范围较小,可以使用递归枚举每一种排列方式,计算出最大值,代码如下:

class Solution {int ans = 0;public int maxGoodNumber(int[] nums) {dfs(0, "", nums);return ans;}void dfs(int i, String res, int[] nums){if(i == (1<<3)-1){ans = Math.max(ans, Integer.parseInt(res, 2));return;}for(int j=0; j<3; j++){if((i>>j&1)==1) continue;dfs(i|1<<j, res + Integer.toBinaryString(nums[j]), nums);}return ;}
}

但是该方式只适用于数据范围较小的题,下面介绍一种 O(nlogn) 的做法,我们先用十进制的方式来思考一下,给你一个数组 [9,10] ,如何使得这个数组用十进制并接得到的值更大?我们当然是比较一下:是9在前大,还是10在前大,然后决定这两个拼接的顺序。那么拓展到大小为 n 的数组如何决定它们的顺序?和上述做法一样,相邻的数依次比较,类似于冒泡排序。那么对于本题使用二进制拼接也是同理,代码如下:

class Solution {public int maxGoodNumber(int[] t) {Integer[] nums = new Integer[t.length];for(int i=0; i<t.length; i++)nums[i] = t[i];//注意要想按照自己的想法排序,必须使用Integer数组Arrays.sort(nums, (x, y)->{int len_x = Integer.toBinaryString(x).length();int len_y = Integer.toBinaryString(y).length();int xy = x << len_y | y;int yx = y << len_x | x;return yx - xy;});int ans = 0;for(int x : nums){int len = Integer.toBinaryString(x).length();ans = ans << len | x;}return ans;}
}

二,3310. 移除可疑的方法

本题题意给你一个可疑方法 k,如果被 k 直接调用/间接调用,那么这些方法也被视为可疑方法(注意:调用可疑方法的方法不是可疑方法),如果没有其他方法调用可疑方法,返回非可疑方法;否则,返回所用方法。

我们可以建立一个图,使用 dfs/bfs 找到所有的可疑方法,然后枚举 invocations 数组,比如每个元素为 [x,y],如果 x 不是可疑方法 && y 是可疑方法,说明有非可疑方法调用可疑方法,返回所有方法;否则只返回非可疑方法。

代码如下:

class Solution {public List<Integer> remainingMethods(int n, int k, int[][] invocations) {List<Integer> ans = new ArrayList<>();List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int[] e : invocations){g[e[0]].add(e[1]);}Queue<Integer> que = new LinkedList<>();que.add(k);Set<Integer> set = new HashSet<>();set.add(k);while(!que.isEmpty()){int x = que.poll();for(int y : g[x]){if(!set.contains(y)){que.add(y);set.add(y);}}}for(int[] e : invocations){if(!set.contains(e[0]) && set.contains(e[1])){for(int i=0; i<n; i++)ans.add(i);return ans;}}for(int i=0; i<n; i++){if(!set.contains(i))ans.add(i);}return ans;}
}

三,3311. 构造符合图结构的二维矩阵

本题可以想象成拼拼图,我们可以先找到四个角落的点(如果行列>=3,那么它只有两个相邻的点),然后不断的往里拼,但是本题不知道四个角的对应位置,所以我们可以先找到一个角洛的点,然后往一边拼,注意一个边上点(除了角落的点),它们相邻的点有三个,不断的填充,直到找到一个这条边的另一个角落(即只有两个相邻点的点),这样我们就拼出一个边了,然后通过这个边不断的往下拼就行了。

上述是行列>=3的情况,如果它只有一行/列,那么它所有点中最少的相邻点必须为1,所以只需要判断最少的相邻是否为1,就直到是否是一行/列。

如果它只有两行/列,那么只需要判断所有点中最多的相邻点是否为4,如果不为4且不是一行/列,说明它只用两行/列。

代码如下:

class Solution {public int[][] constructGridLayout(int n, int[][] edges) {List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e->new ArrayList<>());for(int[] e : edges){g[e[0]].add(e[1]);g[e[1]].add(e[0]);}int[] node = new int[5];Arrays.fill(node, -1);for(int x=0; x<n; x++){node[g[x].size()] = x;}List<Integer> row = new ArrayList<>();if(node[1] != -1){row.add(node[1]);}else if(node[4]==-1){int x = node[2];for(int y : g[x]){if(g[y].size() == 2){row.add(x);row.add(y);break;}}}else{int x = node[2];row.add(x);int pre = x;x = g[x].get(0);while(g[x].size() == 3){row.add(x);for(int y : g[x]){if(y != pre && g[y].size() < 4){pre = x;x = y;break;}}}row.add(x);}int k = row.size();int[][] ans = new int[n/k][k];boolean[] vis = new boolean[n];for(int j=0; j<k; j++){//把第一行放进去int x = row.get(j);ans[0][j] = x;vis[x] = true;}for(int i=1; i<ans.length; i++){for(int j=0; j<k; j++){for(int y : g[ans[i-1][j]]){if(!vis[y]){vis[y] = true;ans[i][j] = y;break;}}}}return ans;}
}

四,3312. 查询排序后的最大公约数

本题最重要的部分就是计算出每个 gcd 出现的次数,对于查询,我们可以使用二分前缀和的方式算出答案。

如何计算每个 gcd 出现的次数?假设要计算 gcd 等于 2 出现的次数,比如说有 n 个 2 的倍数,那么我们可以得到 Cn2 个数对(即 (n-1)*n/2 ),但是这么多数对,不一定每一个 gcd 的值都为 2,比如 4 和 8 的 gcd 就为 4,6 和 12 的 gcd 就为 6,所以我们需要从 (n-1)*n/2 个数对中减去数对的 gcd 为 4,6,8,....。这样就能得到 gcd 为 2 的数对个数了。

定义 cntGcd[i] 表示 gcd 为 i 的数对的个数,cntGcd[i] = (n-1)*n/2 - cntGcd[2*i] - cntGcd[3*i] - ...,从上述公式可以看出,要想计算出 cntGcd[i],必须先计算出 cntGcd[2*i]、cntGcd[3*i],所以我们需要从后往前遍历。

代码如下:

class Solution {//cnt[2] = C(n,2) - cnt[4] - cnt[6] - ...public int[] gcdValues(int[] nums, long[] queries) {int[] cntX = new int[50001];int mx = 0;for(int x : nums){cntX[x]++;mx = Math.max(mx, x);} long[] cnt = new long[mx+1];for(int i=mx; i>=1; i--){int s = 0;for(int j=i; j<mx+1; j+=i){s += cntX[j];cnt[i] -= cnt[j]; //去除2i,3i,4i...(虽然j从i开始,但是cnt[i]初始值为0,所以实际上没有减去i)//为什么不是从2*i开始?因为要计算i的倍数的和s,如果从2i开始会少计算i出现的个数!!}cnt[i] += (long)(s - 1) * s / 2;}for(int i=1; i<mx+1; i++){cnt[i] += cnt[i-1]; }int[] ans = new int[queries.length];for(int i=0; i<queries.length; i++){int l = 1, r = mx;while(l <= r){int mid = (l + r) / 2;if(cnt[mid] <= queries[i]){//为什么加=?因为query[i]可以取到0(当然也可以写成cnt[mid]-1 < queries[i])l = mid + 1;}else{r = mid - 1;}}ans[i] = l;}return ans;}
}

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

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

相关文章

操作系统中的进程管理详细介绍——进程的调度与通信

进程管理是操作系统中至关重要的功能之一&#xff0c;它负责协调和管理计算机系统中运行的所有进程。以下是对进程管理各个方面的详细介绍&#xff1a; 1. 进程调度 进程调度是操作系统决定哪个进程在何时运行的过程&#xff0c;目的是最大化CPU的利用率和系统的整体性能。常…

chatGPT模型接口分享

前言: 仅供学习和交流&#xff0c;请合理使用。 API&#xff1a;https://api.gptnet.org key&#xff1a;sk-x9Rmq3HeHh5z9EIi8wFaXCl02OfxRSk5UAFodYm1o4zo5X3i 支持模型&#xff1a;gpt-3.5-turbo、gpt-3.5-turbo-16k、gpt-4o-mini、llama-3.1-405b 暂时支持以上四个模型…

Java基础-基础知识体系小结 Q/A

文章目录 知识体系Q&AJava 中应该使用什么数据类型来代表价格?怎么将 byte 转换为 String?Java 中怎样将 bytes 转换为 long 类型?存在两个类&#xff0c;B 继承 A&#xff0c;C 继承 B&#xff0c;我们能将 B 转换为 C 么? 如 C (C) B&#xff1b;Java 中 操作符是线…

Java初阶~~四种内部类总结

文章目录 1.内部类的分类2.局部内部类2.1.基本语法2.2就近原则的理解 3.匿名内部类3.1基于接口的匿名内部类3.2基于普通类的匿名内部类3.3基于抽象类的匿名内部类3.4匿名内部类的细节3.5匿名内部类实践3.5.1作为实参进行传递3.5.2实践案例 4.成员内部类4.1基本介绍4.2外部类&am…

5本一投就中的极速期刊,性价比高,1周-1个月录用,见刊极快!

在当今快节奏的学术界&#xff0c;研究者们不仅追求高质量的研究成果&#xff0c;还希望能够迅速地将这些成果分享给全球的同行。为此&#xff0c;科检易学术精心挑选了10本以高效审稿流程著称的期刊&#xff0c;这些期刊不仅性价比高&#xff0c;而且从投稿到录用的时间极短&a…

ARM base instruction -- asr

算术右移&#xff0c;结果带符号。 Arithmetic Shift Right (immediate) shifts a register value right by an immediate number of bits, shifting in copies of the sign bit in the upper bits and zeros in the lower bits, and writes the result to the destination reg…

数据结构_绪论(选择题)

2-1 在数据结构中&#xff0c;从逻辑上可以把数据结构分成&#xff08; &#xff09;。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2-2 与数据元素本身的形式、内容、相对位置、个数无关的是数据的&#xff08; &am…

SD NAND Flash 小容量存储解决方案及其STM32测试例程讲解

文章目录 前言一、Flash闪存是什么&#xff1f;二、SD NAND Flash三、STM32测试例程四、总结 前言 随着移动存储技术的快速发展和便携式数字设备的广泛应用&#xff0c;Flash闪存作为非易失性存储解决方案&#xff0c;在各种电子设备中扮演着越来越重要的角色。本文提供关于Fl…

【含开题报告+文档+PPT+源码】基于SpringBoot乡村助农益农平台的设计与实现

开题报告 近年来&#xff0c;随着社会经济的快速发展和人民生活水平的提高&#xff0c;人们对优质农产品的需求越来越高。然而&#xff0c;传统的农产品销售管理模式存在一些问题。首先&#xff0c;农产品供应链信息不透明&#xff0c;导致生产者难以了解市场需求和价格变动趋…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代&#xff0c;管理和备份手机数据变得越来越重要。无论是转移照片、备份短信&#xff0c;还是管理应用程序&#xff0c;一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件&#xff0c;已经成为许多用户的选择。但是&#xff0c;许多…

《C++代码热更新:为高效开发注入新活力》

一、引言 在软件开发的过程中&#xff0c;我们常常面临着这样的挑战&#xff1a;当程序已经部署到生产环境后&#xff0c;发现了一些需要紧急修复的 bug 或者需要添加新的功能。传统的方法是停止程序运行&#xff0c;进行代码修改&#xff0c;然后重新编译、部署&#xff0c;这…

请用python写一个小程序,把浏览器中打开的页面设置为深色模式

要实现将浏览器中打开的页面设置为深色模式,可以使用Python的selenium库来控制浏览器。以下是一个示例程序: from selenium import webdriver from selenium.webdriver.chrome.options import Options# 创建Chrome浏览器选项对象 chrome_options = Options()# 设置深色模式 …

Anaconda创建环境

目录 前言 第一步&#xff1a;更改环境创建位置 第二步&#xff1a;安装环境 前言 在我们创建多个项目的时候&#xff0c;有时会安装的库版本冲突&#xff0c;所以最好是一个项目一个环境 第一步&#xff1a;更改环境创建位置 新安装Anaconda后&#xff0c;在创建环境时环…

Go版数据结构 -【8.3 插入排序】

8.3 插入排序 插入排序是一种简单且直观的排序算法&#xff0c;它的基本思想是将数组分为已排序和未排序两个部分。 通过逐步将未排序部分的元素插入到已排序部分的正确位置&#xff0c;逐步构建整个有序序列。 看起来与选择排序是差不多的&#xff0c;但是还是有一些差别的…

【React】setState (useState) 是怎么记住上一个状态值的?

在 React 中&#xff0c;setState 通过 React 内部的状态管理机制来记住上一个状态值。即使每次组件重新渲染时&#xff0c;函数组件会被重新执行&#xff0c;React 仍能通过其内部的状态管理系统保持和追踪组件的状态变化。下面详细解释其工作原理&#xff1a; 1. setState 的…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码&#xff1a;路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

python 实现graph list图列算法

graph list图列算法介绍 图列&#xff08;Graph List&#xff09;算法通常指的是在图的表示中&#xff0c;使用列表&#xff08;List&#xff09;或更具体地说&#xff0c;邻接表&#xff08;Adjacency List&#xff09;来表示图的一种算法。邻接表是图的一种常见表示方法&…

Python知识点:结合Python工具,如何使用GPT进行文本生成

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Python工具进行GPT文本生成 概述 GPT&#xff08;Generative Pre-trai…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…