【LeetCode每日一题合集】2023.7.3-2023.7.9

news/2024/5/20 21:51:27/文章来源:https://blog.csdn.net/qq_43406895/article/details/131546261

文章目录

  • 2023.7.3——445. 两数相加 II(大数相加/高精度加法)
  • 2023.7.4——2679. 矩阵中的和
  • 2023.7.5——2600. K 件物品的最大和(贪心)
    • 代码1——贪心模拟
    • 代码2——Java一行
  • 2023.7.6——2178. 拆分成最多数目的正偶数之和(贪心)⭐⭐⭐
    • 思路
    • 代码
  • 2023.7.7——2532. 过桥的时间(复杂大模拟题)⭐⭐⭐⭐⭐
  • 2023.7.8——167. 两数之和 II - 输入有序数组
    • 解法1——双指针
    • 解法2——二分查找
  • 2023.7.9——15. 三数之和
    • 排序 + 枚举第一个数 + 双指针处理后两个数 + 去重
    • 代码优化

2023.7.3——445. 两数相加 II(大数相加/高精度加法)

445. 两数相加 II

在这里插入图片描述

这道题目考察的实际知识点是高精度加法。更多关于高精度计算的内容参见:【算法基础】1.4 高精度(模拟大数运算:整数加减乘除)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 将两个链表的结果存成列表List<Integer> ls1 = new ArrayList(), ls2 = new ArrayList(), ls = new ArrayList();int carry = 0;while (l1 != null) {ls1.add(l1.val);l1 = l1.next;}while (l2 != null) {ls2.add(l2.val);l2 = l2.next;}Collections.reverse(ls1);Collections.reverse(ls2);// 大数加法for (int i1 = 0, i2 = 0, n1 = ls1.size(), n2 = ls2.size(); i1 < n1 || i2 < n2 || carry != 0; ++i1, ++i2) {if (i1 < n1) carry += ls1.get(i1);if (i2 < n2) carry += ls2.get(i2);ls.add(carry % 10);carry /= 10;}// 将列表转成链表结果ListNode dummy = new ListNode(), t = dummy;for (int i = ls.size() - 1; i >= 0; --i) {ListNode cur = new ListNode(ls.get(i));t.next = cur;t = t.next;}return dummy.next;}
}

2023.7.4——2679. 矩阵中的和

2679. 矩阵中的和

在这里插入图片描述
读懂题意,每次操作会删去每一行中的当前最大值,同时将这些行最大值中的最大值加入最后的分数。

为了快速模拟删去每行最大值的操作,我们可以先对各个行进行排序。

class Solution {public int matrixSum(int[][] nums) {int m = nums.length, n = nums[0].length;for (int i = 0; i < m; ++i) Arrays.sort(nums[i]);int ans = 0;for (int j = 0; j < n; ++j) {int mx = 0;for (int i = 0; i < m; ++i) {mx = Math.max(mx, nums[i][j]);}ans += mx;}return ans;}
}

2023.7.5——2600. K 件物品的最大和(贪心)

2600. K 件物品的最大和

在这里插入图片描述

代码1——贪心模拟

要想数字之和最大,肯定先选 1,再选 0,最后选 -1。

class Solution {public int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {int ans = 0;ans += Math.min(numOnes, k);k = k - numOnes - numZeros;if (k > 0) ans -= Math.min(numNegOnes, k);return ans;}
}

代码2——Java一行

思想上没什么区别,代码比较优雅。

class Solution {public int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {return Math.min(numOnes, k) - Math.max(k - numOnes - numZeros, 0);}
}

2023.7.6——2178. 拆分成最多数目的正偶数之和(贪心)⭐⭐⭐

2178. 拆分成最多数目的正偶数之和
在这里插入图片描述

思路

在这里插入图片描述

提示:
1 <= finalSum <= 10^10

代码

class Solution {public List<Long> maximumEvenSplit(long finalSum) {List<Long> ans = new ArrayList();if (finalSum % 2 == 1) return ans;long sum = 0, num = 2;for (long i = 2; i <= finalSum; i += 2) {ans.add(i);finalSum -= i;}ans.set(ans.size() - 1, ans.get(ans.size() - 1) + finalSum);return ans;}
}

2023.7.7——2532. 过桥的时间(复杂大模拟题)⭐⭐⭐⭐⭐

2532. 过桥的时间
在这里插入图片描述
提示:

1 <= n, k <= 10^4
time.length == k
time[i].length == 4
1 <= leftToRighti, pickOldi, rightToLefti, putNewi <= 1000

做这种复杂模拟题,一定要仔细读题!
在这里插入图片描述

class Solution {public int findCrossingTime(int n, int k, int[][] time) {Arrays.sort(time, (a, b) -> {return a[0] + a[2] - b[0] - b[2];});     // 排序之后下标越大的工人效率越低PriorityQueue<int[]> workL = new PriorityQueue<int[]>((a, b) -> a[1] - b[1]);  // 按完成时间升序排序PriorityQueue<int[]> workR = new PriorityQueue<int[]>(workL.comparator());PriorityQueue<int[]> waitL = new PriorityQueue<int[]>((a, b) -> b[0] - a[0]);  // 效率低的排前面PriorityQueue<int[]> waitR = new PriorityQueue<int[]>(waitL.comparator());// 都先加入在左边的等待队列for (int i = k - 1; i >= 0; --i) waitL.offer(new int[]{i, 0});int cur = 0;while (n > 0) {// 左边完成放箱while (!workL.isEmpty() && workL.peek()[1] <= cur) waitL.offer(workL.poll()); // 右边完成搬箱while (!workR.isEmpty() && workR.peek()[1] <= cur) waitR.offer(workR.poll());// 先看右边有没有人等着if (!waitR.isEmpty()) {int[] p = waitR.poll();cur += time[p[0]][2];           // 从右到左的时间p[1] = cur + time[p[0]][3];     // 加上在左边工作的时间放入左边工作队列workL.offer(p);} else if (!waitL.isEmpty()) {      // 再看左边有没有人等着过桥int[] p = waitL.poll();cur += time[p[0]][0];p[1] = cur + time[p[0]][1];workR.offer(p);--n;    // 只要左边的人过去了,就把 n - 1,这样就可以保证所有箱子都有人搬运之后左边就不会有人再过桥了} else if (workL.isEmpty()) cur = workR.peek()[1];  // cur过小,找下一个最近的完成时间else if (workR.isEmpty()) cur = workL.peek()[1];else cur = Math.min(workL.peek()[1], workR.peek()[1]);}// 循环退出时是所有需要搬运箱子的人都过桥到右边去了,因此需要再处理右边的工作队列// 答案就是这些人中最后完成过桥的人// 注意答案要求是最后一个工人达到河左岸的时间,而不是放下箱子的时间while (!workR.isEmpty()) {int[] p = workR.poll();cur = Math.max(p[1], cur) + time[p[0]][2];}return cur;}
}

注意点1:什么时候 --n ?
当有足够多的人去到右边之后就 --n。

注意点2:答案怎么返回?
答案就是最后一个从右边回来的人过完桥之后的时间。

2023.7.8——167. 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组
在这里插入图片描述
提示:
2 <= numbers.length <= 3 * 10^4
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

解法1——双指针

class Solution {public int[] twoSum(int[] numbers, int target) {int l = 0, r = numbers.length - 1;while (l < r) {int x = numbers[l] + numbers[r];if (x == target) return new int[]{l + 1, r + 1};else if (x < target) l++;else r--;}return new int[]{-1, -1};}
}

时间复杂度是: O ( n ) O(n) O(n)

解法2——二分查找

枚举每个位置,然后二分查找是否存在和它配对的即可。

时间复杂度是: O ( n ∗ log ⁡ n ) O(n*\log{}{n}) O(nlogn)

2023.7.9——15. 三数之和

15. 三数之和

在这里插入图片描述
提示:

3 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5

排序 + 枚举第一个数 + 双指针处理后两个数 + 去重

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList();int n = nums.length;for (int i = 0; i < n - 2; ++i) {if (i > 0 && nums[i] == nums[i - 1]) continue;  // 去重int target = -nums[i];for (int l = i + 1, r = n - 1; l < r; ) {int sum = nums[l] + nums[r];if (sum == target) {ans.add(List.of(nums[i], nums[l], nums[r]));    // 加入答案do l++; while (l <= r && nums[l] == nums[l - 1]);do r--; while (r >= l && nums[r] == nums[r + 1]);} else if (sum < target) ++l;else --r;}}return ans;}
}

这里的去重是通过排序后相同元素必定相邻,比较相邻元素是否相等来实现去重的。

代码优化

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList();int n = nums.length;for (int i = 0; i < n - 2; ++i) {if (i > 0 && nums[i] == nums[i - 1]) continue;  // 去重int target = -nums[i];if (nums[i + 1] + nums[i + 2] > target) break;      // 优化1if (nums[n - 1] + nums[n - 2] < target) continue;   // 优化2for (int l = i + 1, r = n - 1; l < r; ) {int sum = nums[l] + nums[r];if (sum == target) {ans.add(List.of(nums[i], nums[l], nums[r]));    // 加入答案do l++; while (l <= r && nums[l] == nums[l - 1]);do r--; while (r >= l && nums[r] == nums[r + 1]);} else if (sum < target) ++l;else --r;}}return ans;}
}

加了两个小优化,速度从 37ms 加速到了 27ms。

在这里插入图片描述
优化1指:当前最小的两个数之和都大于 target 了,之后的 target 会越来越小,所以直接 break。
优化2指:当前最大的两个数之和小于 target,这次循环是不行了,看看之后的 target 变小之后有没有合理的答案。

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

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

相关文章

STM32的ADC模式及其应用例程介绍

STM32的ADC模式及其应用例程介绍 &#x1f4cd;ST官方相关应用笔记介绍资料&#xff1a;https://www.stmcu.com.cn/Designresource/detail/application_note/705947&#x1f4cc;相关例程资源包&#xff1a;STSW-STM32028&#xff1a;https://www.st.com/zh/embedded-software/…

MySQL数据库对象与数据备份和还原详解

目录 一、视图 1. 什么是视图 2. 视图与数据表的区别 3. 视图的优点 4. 创建视图 二、索引 1. 什么是索引 2. 为什么要使用索引 3. 索引优缺点 4. 何时不使用索引 5. 索引何时失效 6. 索引分类 6.1 普通索引 6.2 唯一索引 6.3 主键索引 6.4 组合索引 三、数据的…

Integration Objects OPC 所有产品Crack

OPC产品 OPC UA 升级到 OPC UA 以提高互操作性和安全性。 OPC 隧道 无需 DCOM 即可实现安全可靠的连接。 OPC 数据归档 将 OPC 数据存储到标准数据库或 CSV 文件中。 OPC 服务器 将任何通信协议转换为OPC标准。 OPC 客户端 读取、写入和传输您的 OPC 数据。 OPC 服务器工具…

axios的学习

axios是基于promise对ajax的一种封装 //将省份信息打印到网页上 <p class"my-p"></p> <script src"https://unpkg.com/axios/dist/axios.min.js"></script> <script>axios({url:http://hmajax.itheima.net/api/province}).…

图形学 | 期末复习(上)| games101笔记 | 补档

博客基于GAMES101-现代计算机图形学入门-闫令琪&#xff0c;但不是其完整笔记&#xff0c;基于复习要求有一定的删减。考试以图形学入门基本概念和核心研究内容为主&#xff0c;少量公式。即以论述概念为主&#xff0c;涉及少量算法。p1:29:12是对应的games101视频节点&#xf…

在阿里云上部署Springboot项目

文章目录 环境准备1.安装jdk2.安装mysql3.开启端口 上传项目1.数据库上传2.项目上传 环境准备 1.安装jdk 查看系统中原来是否含有java环境 rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj其中&#xff0c;gcj是一个轻巧的&#xff0c;性能优越的Java语言编译器。它…

基于深度学习的高精度球场足球检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度球场足球检测识别系统可用于日常生活中或野外来检测与定位球场足球目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的球场足球目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

【考研408计算机组成原理】第三章存储系统 第五节cache

3.5.1工作原理 局部性原理&#xff1a;在最近可能会使用到周围的数据和指令。 性能分析&#xff1a;访问数据的时间 例题&#xff1a; 提出问题 知识总结 3.5.2 cache和主存的映射方式 3.5.3 替换算法 3.5.4 cache写策略

确保无缝、安全的云转型

随着云计算继续主导数字化转型&#xff08;这是理所当然的&#xff09;&#xff0c;组织面临着双重挑战&#xff1a;将运营无缝转移到云并确保这种转型的安全。 虽然云的采用保证了可扩展性、成本效率和生产力的提高&#xff0c;但保持警惕对于组织防范网络安全威胁和安全漏洞…

Nuxt3引入Element-plus和sass

1.引入Element-plus 打开编辑器终端 运行npm install element-plus/nuxt 或者命令行cd到项目文件 运行npm install element-plus/nuxt package.json文件会出现 使用Element-plus 在nuxt.config.ts文件添加代码 export default defineNuxtConfig({devtools: { enabled: true }…

<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录 选择排序1.直接选择排序优化直接选择排序 2. 堆排序 选择排序 基本思想 选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置&#xff0c;直到待排序数据全部有序。 直接选择排序和堆排序的基本思想均符合选择排序。 1.直接选择排序 假设数据按升序…

深入理解java虚拟机精华总结:硬件的效率与一致性、Java内存模型、Java与线程、Java与协程

深入理解java虚拟机精华总结&#xff1a;硬件的效率与一致性、Java内存模型、Java与线程、Java与协程 硬件的效率与一致性Java内存模型主内存与工作内存内存间交互操作对于volatile型变量的特殊规则针对long和double型变量的特殊规则原子性、可见性与有序性原子性可见性有序性 …

离线环境下安装微软Visual Studio 2022 生成工具

1. 前言 最近&#xff0c;在学习cython的时候&#xff0c;需要安装windows下的C/C编译、链接工具。开始觉得传统的msvc太大了&#xff0c;想要尝试Mingw&#xff0c;但是都是编译错误。无奈之下&#xff0c;还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools &…

【华为机试】HJ16 购物单详解+完整源代码示例

从毕业到入职&#xff0c;忙于各种事情&#xff0c;所以博客一直也没有空更新。从入职到现在差不多整三个月了&#xff0c;刚刚在比亚迪这边转正。目前干的工作涉及到开发的工作不是很多&#xff0c;但是又怕之前的技能荒废了。所以最近有个想法&#xff0c;再把C算法和数据结构…

【CSS】跳动文字

文章目录 效果展示代码实现 效果展示 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>一颗不甘坠落的流星</title></head><style type"text/css">/* 遮罩盒子样式 */#mask {/* 设…

RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

前言&#xff1a; (broker北京)、(broker深圳)彼此之间相距甚远&#xff0c;网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京&#xff09;需要连接(broker北京),向其中的交换器exchangeA发送消息&#xff0c;此时的网络延迟很小,(Client北京)可以迅速将消息发…

Android studio 引入不了R包,手动引入显示红色。可以跑起来却没问题

之前在这个问题踩坑2次&#xff0c;遂记录一下。 问题是&#xff1a;工程里找不到自己包名的R&#xff0c;手动导入显示红色&#xff0c;Run起来倒是没问题 尝试过Clean&#xff0c;Rebuild&#xff0c;清缓存&#xff0c;重启&#xff0c;都没用。 最终发现是没有在 Android…

回溯法解决地图填色问题

目录 回溯法 最大度优先 最少可选颜色优先 向前探测 随机产生不同规模的图&#xff0c;分析算法效率与图规模的关系&#xff08;四色&#xff09; 回溯法 回溯法的基本思想是采用递归和深度优先搜索的方法&#xff0c;尝试在一组可能的解中搜索出符合要求的解&#xff0c…

git bash---打开当前路径所在文件夹

0 Preface/Foreword 在Windows操作系统中使用git bash时&#xff0c;可以通过命令直接打开当前路径下的文件夹&#xff0c;命令如下 explorer .

机器学习之多元微积分

机器学习的多元微积分跟高等数学中的多元微积分有很多不同之处。 矩阵求导也是一样的&#xff0c;本质就是每个函数分别对矩阵或者向量中的每个元素逐个求偏导&#xff0c;只不过写成了向量、矩阵形式而已。 机器学习中的变量都是向量或者矩阵机器学习中的函数一般都是线性函…