【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录

  • 415. 字符串相加(高精度计算、大数运算)
  • 1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐
    • 解法1——按区间长度排序 + 离线询问 + 并查集
    • 解法2——离线算法 + 优先队列
  • 874. 模拟行走机器人(哈希表 + 方向数组)
  • 918. 环形子数组的最大和⭐⭐⭐⭐⭐(升级版子数组的最大和)
    • 分成两种情况计算,取两种情况的最大值
  • 1499. 满足不等式的最大值(单调队列 | 优先队列)
    • 解法1——单调队列维护窗口内的最大值
    • 解法2——优先队列/堆
  • 860. 柠檬水找零(简单无聊模拟题)
  • 42. 接雨水(🐂好题)
    • 解法1——单调栈
    • 解法2——双指针

415. 字符串相加(高精度计算、大数运算)

https://leetcode.cn/problems/add-strings/description/
在这里插入图片描述

模拟即可。

class Solution {public String addStrings(String num1, String num2) {StringBuilder ans = new StringBuilder();for (int i = num1.length() - 1, j = num2.length() - 1, c = 0; i >= 0 || j >= 0 || c != 0; --i, --j) {if (i >= 0) c += num1.charAt(i) - '0';if (j >= 0) c += num2.charAt(j) - '0';ans.append(c % 10);c /= 10;}return ans.reverse().toString();}
}

更多大数计算可见:
【算法基础】1.4 高精度(模拟大数运算:整数加减乘除)
Java【大数类】整理

1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐

https://leetcode.cn/problems/minimum-interval-to-include-each-query/

在这里插入图片描述

提示:
1 <= intervals.length <= 10^5
1 <= queries.length <= 10^5
queries[i].length == 2
1 <= lefti <= righti <= 10^7
1 <= queries[j] <= 10^7

解法1——按区间长度排序 + 离线询问 + 并查集

https://leetcode.cn/problems/minimum-interval-to-include-each-query/solutions/755131/an-qu-jian-chang-du-pai-xu-chi-xian-bing-6jzs/

换个角度,对每个区间,去回答包含这个区间的询问。

按照区间长度从小到大排序,遍历每个区间,我们可以直接回答在该区间内的尚未被回答的询问,这是因为区间是按长度从小到大排序的,这些未被回答的询问所需要找的最小区间就是当前区间。

由于一个区间内可能存在已经被回答过的询问,所以我们需要跳过这些询问,这可以用并查集来维护,当我们回答一个区间时,将区间所有元素指向其下一个元素,这样当我们用并查集查询到一个回答完毕的区间的左端点时,自然就跳到了区间的右端点的右侧。

class Solution {public int[] minInterval(int[][] intervals, int[] queries) {// 按区间长度从小到大进行排序Arrays.sort(intervals, (a, b) -> a[1] - a[0] - (b[1] - b[0]));int m = queries.length;int[][] qs = new int[m][2];for (int i = 0; i < m; ++i) {qs[i] = new int[]{queries[i], i};}Arrays.sort(qs, (a, b) -> a[0] - b[0]);     // 按查询位置从小到大进行排序// 初始化并查集int[] p = new int[m + 1];Arrays.setAll(p, e -> e);int[] ans = new int[m];Arrays.fill(ans, -1);// 对每个区间,回答所有在 [l, r] 范围内的询问// 由于每次回答询问之后,都将其指向了下一个询问// 所以若 i = find(i) 符合 i < m && qs[i][0] <= r 的条件,则必然是一个在[l, r] 范围内还没有回答过的询问for (int[] interval: intervals) {int l = interval[0], r = interval[1];   // 取出当前区间int len = r - l + 1;int i = bs(qs, l);                      // 找到查询中第一个大于等于左端点的位置// 回答所有询问位置在 [l, r] 范围内还没有被回答过的询问for (i = find(i, p); i < m && qs[i][0] <= r; i = find(i + 1, p)) {ans[qs[i][1]] = len;p[i] = i + 1;}}return ans;}public int bs(int[][] qs, int t) {int l = 0, r = qs.length;while (l < r) {int mid = l + (r - l) / 2;if (qs[mid][0] < t) l = mid + 1;else r = mid;}return l;}public int find(int x, int[] p) {if (p[x] != x) p[x] = find(p[x], p);return p[x];}
}

解法2——离线算法 + 优先队列

https://leetcode.cn/problems/minimum-interval-to-include-each-query/solutions/755628/bao-han-mei-ge-cha-xun-de-zui-xiao-qu-ji-e21j/

874. 模拟行走机器人(哈希表 + 方向数组)

https://leetcode.cn/problems/walking-robot-simulation/description/
在这里插入图片描述
用哈希表存储障碍物位置,然后使用方向数组模拟即可。

class Solution {public int robotSim(int[] commands, int[][] obstacles) {int[] dx = new int[]{0, 1, 0, -1}, dy = new int[]{1, 0, -1, 0};int ans = 0, t = 0, x = 0, y = 0;Set<String> s = new HashSet<String>();for (int[] obstacle: obstacles) s.add(obstacle[0] + " " + obstacle[1]);for (int c: commands) {if (c == -2) t = (t + 3) % 4;else if (c == -1) t = (t + 1) % 4;else {for (int d = 1; d <= c; ++d) {if (s.contains((x + dx[t]) + " " + (y + dy[t]))) break;x += dx[t];y += dy[t];}ans = Math.max(ans, x * x + y * y);}}return ans;}
}

918. 环形子数组的最大和⭐⭐⭐⭐⭐(升级版子数组的最大和)

https://leetcode.cn/problems/maximum-sum-circular-subarray/

在这里插入图片描述

提示:

n == nums.length
1 <= n <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4​​​​​​​

分成两种情况计算,取两种情况的最大值

在这里插入图片描述

第一种情况就是 普通 子数组的最大和。
第二种情况就是 前缀 + 后缀 的最大和。

class Solution {public int maxSubarraySumCircular(int[] nums) {int n = nums.length, leftSum = nums[0], pre = nums[0], res = nums[0];int[] leftMax = new int[n];leftMax[0] = nums[0];for (int i = 1; i < n; ++i) {pre = Math.max(nums[i], pre + nums[i]);res = Math.max(res, pre);leftSum += nums[i];     // leftSum是前缀和leftMax[i] = Math.max(leftMax[i - 1], leftSum);}int rightSum = 0;           // rightSum是后缀和for (int i = n - 1; i > 0; --i) {rightSum += nums[i];res = Math.max(res, rightSum + leftMax[i - 1]);}return res;}
}

1499. 满足不等式的最大值(单调队列 | 优先队列)

https://leetcode.cn/problems/max-value-of-equation/

在这里插入图片描述

解法1——单调队列维护窗口内的最大值

从前往后枚举 j ,使用单调队列维护 yi - xi 的最大值。

class Solution {public int findMaxValueOfEquation(int[][] points, int k) {int n = points.length, ans = Integer.MIN_VALUE;Deque<Integer> dq = new ArrayDeque<Integer>();// 从前向后枚举 x 一定大于之前的 公式变成 yi + yj + xj - xi(这里 i < j)// 所以单调队列里按 yi - xi 从大到小排序for (int j = 0; j < n; ++j) {// 移除 xj - xi < k 的 iwhile (!dq.isEmpty() && points[j][0] - points[dq.peekFirst()][0] > k) dq.pollFirst();// 更新答案if (!dq.isEmpty()) {int i = dq.peekFirst();ans = Math.max(points[j][0] + points[j][1] - points[i][0] + points[i][1], ans);}// 更新单调队列int v = points[j][1] - points[j][0];while (!dq.isEmpty() && v >= points[dq.peekLast()][1] - points[dq.peekLast()][0]) dq.pollLast();dq.offerLast(j);}return ans;}
}

解法2——优先队列/堆

使用优先队列,队列中的元素是 int[] {x - y, x}

class Solution {public int findMaxValueOfEquation(int[][] points, int k) {int n = points.length, ans = Integer.MIN_VALUE;// 堆中元素按 x - y 从小到大排序PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);for (int[] point: points) {int x = point[0], y = point[1];while (!pq.isEmpty() && pq.peek()[1] < x - k) pq.poll();if (!pq.isEmpty()) ans = Math.max(ans, x + y - pq.peek()[0]);pq.offer(new int[]{x - y, x});}return ans;}
}

860. 柠檬水找零(简单无聊模拟题)

https://leetcode.cn/problems/lemonade-change/submissions/

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

1 <= bills.length <= 10^5
bills[i] 不是 5 就是 10 或是 20

class Solution {public boolean lemonadeChange(int[] bills) {int[] cnt = new int[21];for (int bill: bills) {cnt[bill]++;if (bill == 10) cnt[5]--;else if (bill == 20) {if (cnt[10] > 0) {cnt[10]--;cnt[5]--;} else cnt[5] -= 3;}if (cnt[5] < 0) return false;}return true;}
}

42. 接雨水(🐂好题)

https://leetcode.cn/problems/trapping-rain-water/description/

在这里插入图片描述

解法1——单调栈

class Solution {public int trap(int[] height) {int n = height.length, ans = 0;Deque<Integer> stk = new ArrayDeque();for (int i = 0; i < n; ++i) {// 单调递减的栈while (!stk.isEmpty() && height[i] >= height[stk.peek()]) {int last = stk.pop();if (!stk.isEmpty()) {int second = stk.pop();ans += (Math.min(height[i], height[second]) - height[last]) * (i - second - 1);stk.push(second);}}stk.push(i);}return ans;}
}

解法2——双指针

class Solution {public int trap(int[] height) {int n = height.length, l = 0, r = n - 1, ml = height[l], mr = height[r], ans = 0;while (l <= r) {if (ml < mr) {ans += ml - height[l++];if (l <= r) ml = Math.max(ml, height[l]);} else {ans += mr - height[r--];if (r >= l) mr = Math.max(mr, height[r]);}}return ans;}
}

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

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

相关文章

sentinel深入讲解流量控制/熔断降级

文章目录 sentinelsentinel介绍重要的核心概念引入依赖限流的规则熔断规则yaml 项目配置使用注解 SentinelResource讲解类的静态方法 sentinel sentinel介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构…

【深度学习之YOLO8】环境部署

目录 一、确定版本CUDA toolkit、cuDNN版本Python、PyTorch版本 二、安装Python下载环境变量验证安装 三、安装Anaconda安装环境变量验证安装创建conda虚拟环境常用命令 四、安装CUDA toolkit下载环境变量验证安装 五、配置cuDNN下载 六、安装PyTorch(torchtorchversiontorchau…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(五)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

RUST腐蚀基因种植

RUST腐蚀基因种植 试验地址:www.xiaocao.cloud RUST基因: RUST基因计算器&#xff0c;腐蚀基因计算器&#xff0c;前后端分离架构&#xff0c;前端目录/resouce/ui/rust&#xff0c;欢迎大佬评价&#xff0c;

算法笔记(java)——回溯篇

回溯算法解决问题最有规律性&#xff0c;借用一下卡哥的图&#xff1a; 只要遇到上述问题就可以考虑使用回溯&#xff0c;回溯法的效率并不高&#xff0c;是一种暴力解法&#xff0c;其代码是嵌套在for循环中的递归&#xff0c;用来解决暴力算法解决不了的问题&#xff0c;即…

Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识

环境是树莓派3B&#xff0c;当然这里安装tensorflow并不是一定要在树莓派环境&#xff0c;只需要是ARM架构就行&#xff0c;也就是目前市场上绝大部分的嵌入式系统都是用这套精简指令集。 在电脑端的检测&#xff0c;有兴趣的可以查阅SSD(Single Shot MultiBox Detector)系列&a…

19 QListWidget控件

Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码&#xff1a; //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…

十、正则表达式详解:掌握强大的文本处理工具(二)

文章目录 &#x1f340;多字符匹配&#x1f340;匹配规则的代替&#x1f340;特殊的匹配&#x1f340;特殊的匹配plus&#x1f340;总结 &#x1f340;多字符匹配 星号&#xff08;*&#xff09;&#xff1a;匹配0个或者多个字符 import retext 111-222-333 result re.matc…

苹果的Apple GPT要来了?

据外媒消息&#xff0c;苹果正在内部开发类 ChatGPT 的产品&#xff0c;与微软、OpenAI、谷歌、Meta 等科技巨头在生成式 AI 赛道展开竞争。该消息使得苹果股价上涨了 2%。据苹果工程师透露&#xff0c;苹果在内部构建了代号为“Ajax”的大语言模型开发框架&#xff0c;并构建了…

Unity自定义后处理——Bloom效果

大家好&#xff0c;我是阿赵。   继续介绍屏幕后处理效果&#xff0c;这一期讲一下Bloom效果。 一、Bloom效果介绍 还是拿这个模型作为背景。 Bloom效果&#xff0c;就是一种全屏泛光的效果&#xff0c;让模型和特效有一种真的在发光的感觉。 根据参数不一样&#xff0c;可…

Packet Tracer – 实施静态 NAT 和动态 NAT

Packet Tracer – 实施静态 NAT 和动态 NAT 拓扑图 目标 第 1 部分&#xff1a;利用 PAT 配置动态 NAT 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;验证 NAT 实施 第 1 部分&#xff1a; 利用 PAT 配置动态 NAT 步骤 1&#xff1a; 配置允许用于 NAT …

【基于CentOS 7 的iscsi服务】

目录 一、概述 1.简述 2.作用 3. iscsi 4.相关名称 二、使用步骤 - 构建iscsi服务 1.使用targetcli工具进入到iscsi服务器端管理界面 2.实现步骤 2.1 服务器端 2.2 客户端 2.2.1 安装软件 2.2.2 在认证文件中生成iqn编号 2.2.3 开启客户端服务 2.2.4 查找可用的i…

AJAX-day03-AJAX进阶

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 同步代码和异步代码 回调函数地狱 Promise - 链式调用 Promise 链式应用 async函数和await async函…

Stable Diffusion入门笔记(自用)

学习视频&#xff1a;20分钟搞懂Prompt与参数设置&#xff0c;你的AI绘画“咒语”学明白了吗&#xff1f; | 零基础入门Stable Diffusion保姆级新手教程 | Prompt关键词教学_哔哩哔哩_bilibili 1.图片提示词模板 2.权重&#xff08;提示词&#xff09; 无数字 (flower)//花的…

MQTT网关 5G物联网网关 PLC控制工业网关

MQTT网关&#xff0c;两个以上的节点之间通信的新型网关&#xff0c;网络节点之间通过互连来实现双向通信。支持PLC协议转MQTT&#xff0c;实现plc数据采集上云&#xff0c;物联网云平台对接&#xff0c;广泛应用于工业自动化plc远程监测控制。 计讯物联5G MQTT物联网网关TG463…

如何解决 Git 合并冲突

在遇到合并冲突时&#xff0c;请不要惊慌。通过一些娴熟的技巧协商&#xff0c;你可以解决任何冲突。 假设你和我正在共同编辑同一个名称为 index.html 的文件。我对文件进行了修改&#xff0c;进行了提交&#xff0c;并将更改推送到 Git 远程仓库。你也对同一个文件进行了修改…

酷雷曼无人机技能培训考试圆满举办

2023年7月18日、19日&#xff0c;以“向云端起航&#xff0c;让技术落地”为主题的酷雷曼无人机技能提升培训会在酷雷曼北京运营中心隆重举行&#xff0c;来自全国各地的众多合作商参加了本次培训&#xff0c;通过系统、全面的学习成功取得了专业无人机飞行员执照&#xff0c;为…

BEVDet 论文解读

BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View 作者单位 PhiGent Robotics 目的 2D 的视觉感知在过去的几年里有了急速的发展&#xff0c;涌现出一些优秀的范式工作&#xff0c;这些工作有较高的性能&#xff0c;可扩展性&#xff0c;以及多…

【数学建模】--典型相关分析

典型相关分析&#xff08;Canonical Correlation analysis&#xff09;研究两组变量&#xff08;每组变量中都可能有多个指标&#xff09;之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 例子&#xff1a; 典型相关分析定义&#xff1a; 列题分析&…

OpenCV自带的HAAR级联分类器对脸部(人脸、猫脸等)的检测识别

在计算机视觉领域&#xff0c;检测人脸等是一种很常见且非常重要的应用&#xff0c;我们可以先通过开放计算机视觉库OpenCV来熟悉这个人脸识别领域。另外OpenCV关于颜色的识别&#xff0c;可以查阅&#xff1a;OpenCV的HSV颜色空间在无人车中颜色识别的应用HSV颜色识别的跟踪实…