【题解】—— LeetCode一周小结50

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)


【题解】—— 每日一道题目栏


上接:【题解】—— LeetCode一周小结49

9.判断国际象棋棋盘中一个格子的颜色

题目链接:1812. 判断国际象棋棋盘中一个格子的颜色

给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。

在这里插入图片描述

如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false 。

给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第二个字符是数字。

示例 1:

输入:coordinates = “a1”

输出:false

解释:如上图棋盘所示,“a1” 坐标的格子是黑色的,所以返回 false 。

示例 2:

输入:coordinates = “h3”

输出:true

解释:如上图棋盘所示,“h3” 坐标的格子是白色的,所以返回 true 。

示例 3:

输入:coordinates = “c7”

输出:false

提示:

coordinates.length == 2

‘a’ <= coordinates[0] <= ‘h’

‘1’ <= coordinates[1] <= ‘8’

题解:

class Solution {public boolean squareIsWhite(String s) {return s.charAt(0) % 2 != s.charAt(1) % 2;}
} 

10.骑士拨号器

题目链接:935. 骑士拨号器

象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个 L 的形状)。

象棋骑士可能的移动方式如下图所示:

在这里插入图片描述

我们有一个象棋骑士和一个电话垫,如下所示,骑士只能站在一个数字单元格上(即蓝色单元格)。
在这里插入图片描述

给定一个整数 n,返回我们可以拨多少个长度为 n 的不同电话号码。

你可以将骑士放置在任何数字单元格上,然后你应该执行 n - 1 次移动来获得长度为 n 的号码。所有的跳跃应该是有效的骑士跳跃。

因为答案可能很大,所以输出答案模 109 + 7.

示例 1:

输入:n = 1

输出:10

解释:我们需要拨一个长度为1的数字,所以把骑士放在10个单元格中的任何一个数字单元格上都能满足条件。

示例 2:

输入:n = 2

输出:20

解释:我们可以拨打的所有有效号码为[04, 06, 16, 18, 27, 29, 34, 38, 40, 43, 49, 60, 61,
67, 72, 76, 81, 83, 92, 94]

示例 3:

输入:n = 3131

输出:136006598

解释:注意取模

提示:

1 <= n <= 5000

题解:
方法:递归 动态规划
        

class Solution {private static final int MOD = 1_000_000_007;private static final int[][] NEXT = {{4, 6}, {6, 8}, {7, 9}, {4, 8}, {0, 3, 9}, {}, {0, 1, 7}, {2, 6}, {1, 3}, {2, 4}};private static final int[][] memo = new int[5000][10];public int knightDialer(int n) {if (n == 1) {return 10;}int ans = 0;for (int j = 0; j < 10; j++) {ans = (ans + dfs(n - 1, j)) % MOD;}return ans;}private int dfs(int i, int j) {if (i == 0) {return 1;}if (memo[i][j] > 0) { // 之前计算过return memo[i][j];}int res = 0;for (int k : NEXT[j]) {res = (res + dfs(i - 1, k)) % MOD;}return memo[i][j] = res; // 记忆化}
} 

11.半有序排列

题目链接:2717. 半有序排列

给你一个下标从 0 开始、长度为 n 的整数排列 nums 。

如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列 :

选择 nums 中相邻的两个元素,然后交换它们。
返回使 nums 变成 半有序排列 所需的最小操作次数。

排列 是一个长度为 n 的整数序列,其中包含从 1 到 n 的每个数字恰好一次。

示例 1:

输入:nums = [2,1,4,3]

输出:2

解释:可以依次执行下述操作得到半有序排列:

1 - 交换下标 0 和下标 1 对应元素。排列变为 [1,2,4,3] 。

2 - 交换下标 2 和下标 3 对应元素。排列变为 [1,2,3,4] 。

可以证明,要让 nums 成为半有序排列,不存在执行操作少于 2 次的方案。

示例 2:

输入:nums = [2,4,1,3]

输出:3

解释:

可以依次执行下述操作得到半有序排列:

1 - 交换下标 1 和下标 2 对应元素。排列变为 [2,1,4,3] 。

2 - 交换下标 0 和下标 1 对应元素。排列变为 [1,2,4,3] 。

3 - 交换下标 2 和下标 3 对应元素。排列变为 [1,2,3,4] 。

可以证明,要让 nums 成为半有序排列,不存在执行操作少于 3 次的方案。

示例 3:

输入:nums = [1,3,4,2,5]

输出:0

解释:这个排列已经是一个半有序排列,无需执行任何操作。

提示:

2 <= nums.length == n <= 50

1 <= nums[i] <= 50

nums 是一个 排列

题解:
方法:分类讨论
        

class Solution {public int semiOrderedPermutation(int[] nums) {int n = nums.length;int p = 0;int q = 0;for (int i = 0; i < n; i++) {if (nums[i] == 1) {p = i;} else if (nums[i] == n) {q = i;}}return p + n - 1 - q - (p > q ? 1 : 0);}
} 

12.购买物品的最大开销

题目链接:2931. 购买物品的最大开销

给你一个下标从 0 开始大小为 m * n 的整数矩阵 values ,表示 m 个不同商店里 m * n 件不同的物品。每个商店有 n 件物品,第 i 个商店的第 j 件物品的价值为 values[i][j] 。除此以外,第 i 个商店的物品已经按照价值非递增排好序了,也就是说对于所有 0 <= j < n - 1 都有 values[i][j] >= values[i][j + 1] 。

每一天,你可以在一个商店里购买一件物品。具体来说,在第 d 天,你可以:

选择商店 i 。
购买数组中最右边的物品 j ,开销为 values[i][j] * d 。换句话说,选择该商店中还没购买过的物品中最大的下标 j ,并且花费 values[i][j] * d 去购买。
注意,所有物品都视为不同的物品。比方说如果你已经从商店 1 购买了物品 0 ,你还可以在别的商店里购买其他商店的物品 0 。

请你返回购买所有 m * n 件物品需要的 最大开销 。

示例 1:

输入:values = [[8,5,2],[6,4,1],[9,7,3]]

输出:285

解释:第一天,从商店 1 购买物品 2 ,开销为 values[1][2] * 1 = 1 。

第二天,从商店 0 购买物品 2 ,开销为 values[0][2] * 2 = 4 。

第三天,从商店 2 购买物品 2 ,开销为 values[2][2] * 3 = 9 。

第四天,从商店 1 购买物品 1 ,开销为 values[1][1] * 4 = 16 。

第五天,从商店 0 购买物品 1 ,开销为 values[0][1] * 5 = 25 。

第六天,从商店 1 购买物品 0 ,开销为 values[1][0] * 6 = 36 。

第七天,从商店 2 购买物品 1 ,开销为 values[2][1] * 7 = 49 。

第八天,从商店 0 购买物品 0 ,开销为 values[0][0] * 8 = 64 。

第九天,从商店 2 购买物品 0 ,开销为 values[2][0] * 9 = 81 。

所以总开销为 285 。

285 是购买所有 m * n 件物品的最大总开销。

示例 2:

输入:values = [[10,8,6,4,2],[9,7,5,3,2]]

输出:386

解释:第一天,从商店 0 购买物品 4 ,开销为 values[0][4] * 1 = 2 。

第二天,从商店 1 购买物品 4 ,开销为 values[1][4] * 2 = 4 。

第三天,从商店 1 购买物品 3 ,开销为 values[1][3] * 3 = 9 。

第四天,从商店 0 购买物品 3 ,开销为 values[0][3] * 4 = 16 。

第五天,从商店 1 购买物品 2 ,开销为 values[1][2] * 5 = 25 。

第六天,从商店 0 购买物品 2 ,开销为 values[0][2] * 6 = 36 。

第七天,从商店 1 购买物品 1 ,开销为 values[1][1] * 7 = 49 。

第八天,从商店 0 购买物品 1 ,开销为 values[0][1] * 8 = 64 。

第九天,从商店 1 购买物品 0 ,开销为 values[1][0] * 9 = 81 。

第十天,从商店 0 购买物品 0 ,开销为 values[0][0] * 10 = 100 。

所以总开销为 386 。

386 是购买所有 m * n 件物品的最大总开销。

提示:

1 <= m == values.length <= 10

1 <= n == values[i].length <= 104

1 <= values[i][j] <= 106

values[i] 按照非递增顺序排序。

题解:
方法:最小堆
        

class Solution {public long maxSpending(int[][] values) {int m = values.length;int n = values[0].length;PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> values[a[0]][a[1]] - values[b[0]][b[1]]);for (int i = 0; i < m; i++) {pq.offer(new int[]{i, n - 1});}long ans = 0;for (int d = 1; d <= m * n; d++) {int[] p = pq.poll();int i = p[0];int j = p[1];ans += (long) values[i][j] * d;if (j > 0) {pq.offer(new int[]{i, j - 1});}}return ans;}
} 

13.K 次乘运算后的最终数组 I

题目链接:3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。

你需要对 nums 执行 k 次操作,每次操作中:

找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。
将 x 替换为 x * multiplier 。
请你返回执行完 k 次乘运算之后,最终的 nums 数组。

示例 1:

输入:nums = [2,1,3,5,6], k = 5, multiplier = 2

输出:[8,4,6,5,6]

解释:

操作 结果

1 次操作后 [2, 2, 3, 5, 6]

2 次操作后 [4, 2, 3, 5, 6]

3 次操作后 [4, 4, 3, 5, 6]

4 次操作后 [4, 4, 6, 5, 6]

5 次操作后 [8, 4, 6, 5, 6]

示例 2:

输入:nums = [1,2], k = 3, multiplier = 4

输出:[16,8]

解释:

操作 结果

1 次操作后 [4, 2]

2 次操作后 [4, 8]

3 次操作后 [16, 8]

提示:

1 <= nums.length <= 100

1 <= nums[i] <= 100

1 <= k <= 10

1 <= multiplier <= 5

题解:
方法:优先队列(小根堆)+ 模拟
        

class Solution {public int[] getFinalState(int[] nums, int k, int multiplier) {PriorityQueue<Integer> pq= new PriorityQueue<>((i, j) -> nums[i] - nums[j] == 0 ? i - j : nums[i] - nums[j]);for (int i = 0; i < nums.length; i++) {pq.offer(i);}while (k-- > 0) {int i = pq.poll();nums[i] *= multiplier;pq.offer(i);}return nums;}
} 

14.K 次乘运算后的最终数组 II

题目链接:3266. K 次乘运算后的最终数组 II

给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。

你需要对 nums 执行 k 次操作,每次操作中:

找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。
将 x 替换为 x * multiplier 。
请你返回执行完 k 次乘运算之后,最终的 nums 数组。

示例 1:

输入:nums = [2,1,3,5,6], k = 5, multiplier = 2

输出:[8,4,6,5,6]

解释:

操作 结果

1 次操作后 [2, 2, 3, 5, 6]

2 次操作后 [4, 2, 3, 5, 6]

3 次操作后 [4, 4, 3, 5, 6]

4 次操作后 [4, 4, 6, 5, 6]

5 次操作后 [8, 4, 6, 5, 6]

示例 2:

输入:nums = [1,2], k = 3, multiplier = 4

输出:[16,8]

解释:

操作 结果

1 次操作后 [4, 2]

2 次操作后 [4, 8]

3 次操作后 [16, 8]

提示:

1 <= nums.length <= 100

1 <= nums[i] <= 100

1 <= k <= 10

1 <= multiplier <= 5

题解:
方法:最小堆模拟+数学公式
        

class Solution {private static final int MOD = 1_000_000_007;public int[] getFinalState(int[] nums, int k, int multiplier) {if (multiplier == 1) { // 数组不变return nums;}int n = nums.length;int mx = 0;PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) -> a[0] != b[0] ? Long.compare(a[0], b[0]) : Long.compare(a[1], b[1]));for (int i = 0; i < n; i++) {mx = Math.max(mx, nums[i]);pq.offer(new long[]{nums[i], i});}// 模拟,直到堆顶是 mxfor (; k > 0 && pq.peek()[0] < mx; k--) {long[] p = pq.poll();p[0] *= multiplier;pq.offer(p);}// 剩余的操作可以直接用公式计算for (int i = 0; i < n; i++) {long[] p = pq.poll();nums[(int) p[1]] = (int) (p[0] % MOD * pow(multiplier, k / n + (i < k % n ? 1 : 0)) % MOD);}return nums;}private long pow(long x, int n) {long res = 1;for (; n > 0; n /= 2) {if (n % 2 > 0) {res = res * x % MOD;}x = x * x % MOD;}return res;}
} 

15.数组大小减半

题目链接:1338. 数组大小减半

给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。

返回 至少 能删除数组中的一半整数的整数集合的最小大小。

示例 1:

输入:arr = [3,3,3,3,5,5,5,2,2,7]

输出:2

解释:选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5(原数组长度的一半)。
大小为 2 的可行集合有
{3,5},{3,2},{5,2}。

选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。

示例 2:

输入:arr = [7,7,7,7,7,7]

输出:1

解释:我们只能选择集合 {7},结果数组为空。

提示:

1 <= arr.length <= 105

arr.length 为偶数

1 <= arr[i] <= 105

题解:
方法:哈希表
        

class Solution {public int minSetSize(int[] arr) {Map<Integer, Integer> freq = new HashMap<>();for (int x : arr) {freq.merge(x, 1, Integer::sum); // freq[x]++}List<Integer> cnt = new ArrayList<>(freq.values());cnt.sort((a, b) -> b - a);int s = 0;for (int i = 0; ; i++) {s += cnt.get(i);if (s >= arr.length / 2) {return i + 1;}}}
} 

下接:【题解】—— LeetCode一周小结51


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

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

相关文章

Docker安全性与最佳实践

一、引言&#xff1a;Docker安全性的重要性 Docker作为一种容器化技术&#xff0c;已成为现代应用程序部署和开发的核心工具。然而&#xff0c;随着容器化应用的普及&#xff0c;Docker的安全性问题也日益突出。容器本身的隔离性、网络配置、权限管理等方面的安全隐患&#xf…

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H&#xff0c;查找模式选择 ‘正则表达式’&#xff0c;不选 ‘.匹配新行’ 2、查找目标输入 &#xff1a; ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为&#xff1a;&#xff08;空&#xff09; 配置界面参考下图&#xff1a; ​​…

上传图片的预览

解决:在上传图片时,1显示已有的图片 2显示准备替换的图片 前 后 在这个案例中可以预览到 【已有与准备替换】 2张图片 具体流程 1创建一个共享组件 与manage.py同级别路径的文件 manage.py custom_widgets.py# custom_widgets.py from django import forms from dja…

MySQL学习之DDL操作

目录 数据库的操作 创建 查看 选择 删除 修改 数据类型 表的创建 表的修改 表的约束 主键 PRIMARY KEY 唯一性约束 UNIQUE 非空约束 NOT NULL 外键约束 约束小结 索引 索引分类 常规索引 主键索引 唯一索引 外键索引 优点 缺点 视图 创建 删除 修改…

国际网络专线是什么?有什么优势?

国际网络专线作为一种独立的网络连接方式&#xff0c;通过卫星或海底光缆等物理链路&#xff0c;将全球不同国家和地区的网络直接互联&#xff0c;为企业提供了可靠的通信渠道。本文将详细探讨国际网络专线的优势以及其广泛的应用场景。 国际网络专线的优势解析 1. 专属连接&am…

密码编码学与网络安全(第五版)答案

通过如下代码分别统计一个字符的频率和三个字符的频率&#xff0c;"8"——"e"&#xff0c;“&#xff1b;48”——“the”&#xff0c;英文字母的相对使用频率&#xff0c;猜测频率比较高的依此为&#xff09;&#xff0c;t,*,5&#xff0c;分别对应s,o,n,…

【功能安全】随机硬件失效导致违背安全目标的评估(FMEDA)

目录 01 随机硬件失效介绍 02 FMEDA介绍 03 FMEDA模板 01 随机硬件失效介绍 GBT 34590 part5

mybatis 的动态sql 和缓存

动态SQL 可以根据具体的参数条件&#xff0c;来对SQL语句进行动态拼接。 比如在以前的开发中&#xff0c;由于不确定查询参数是否存在&#xff0c;许多人会使用类似于where 1 1 来作为前缀&#xff0c;然后后面用AND 拼接要查询的参数&#xff0c;这样&#xff0c;就算要查询…

Web APIs - 第5章笔记

目标&#xff1a; 依托 BOM 对象实现对历史、地址、浏览器信息的操作或获取 具备利用本地存储实现学生就业表案例的能力 BOM操作 综合案例 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。 比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DO…

AI视频配音技术创新应用与商业机遇

随着人工智能技术的飞速发展&#xff0c;AI视频配音技术已经成为内容创作者和营销人员的新宠。这项技术不仅能够提升视频内容的吸引力&#xff0c;还能为特定行业带来创新的解决方案。本文将探讨AI视频配音技术的应用场景&#xff0c;并讨论如何合法合规地利用这一技术。 AI视频…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法&#xff0c;vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

Java每日一题(1)

给定n个数a1,a2,...an,求它们两两相乘再相加的和。 即&#xff1a;Sa1*a2a1*a3...a1*ana2*a3...an-2*an-1an-2*anan-1*an 第一行输入的包含一个整数n。 第二行输入包含n个整数a1,a2,...an。 样例输入 4 1 3 6 9 样例输出 117 答案 import java.util.Scanner; // 1:无…

Redis应用—6.热key探测设计与实践

大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的组成 7.热key探测框架JdHotkey的工作流程 8.热key探测框架JdHotkey的性能表现 9.关于热key探测框架JdHotke…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者&#xff1a;来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么&#xff1f; Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

python爬虫入门教程

安装python 中文网 Python中文网 官网 安装好后打开命令行执行&#xff08;如果没有勾选添加到Path则注意配置环境变量&#xff09; python 出现如上界面则安装成功 设置环境变量 右键我的电脑->属性 设置下载依赖源 默认的是官网比较慢&#xff0c;可以设置为清华大…

数据结十大排序之(冒泡,快排,并归)

接上期&#xff1a; 数据结十大排序之&#xff08;选排&#xff0c;希尔&#xff0c;插排&#xff0c;堆排&#xff09;-CSDN博客 前言&#xff1a; 在计算机科学中&#xff0c;排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发&#xff0c;…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体&#xff0c;这些实体位于玩家的视野中&#xff0c;频繁更新&#xff0c;而那些离玩家较远的实体则以较低的频率运…

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…