【LeetCode每日一题合集】2023.11.27-2023.12.3 (⭐)

文章目录

  • 907. 子数组的最小值之和(单调栈+贡献法)
  • 1670. 设计前中后队列⭐(设计数据结构)
    • 解法1——双向链表
    • 解法2——两个双端队列
  • 2336. 无限集中的最小数字
    • 解法1——维护最小变量mn 和 哈希表维护已经去掉的数字
    • 解法2——维护原本可用的最小值 和 有序集合维护后期添加的数值👌
  • 1657. 确定两个字符串是否接近(理解操作本质)⭐
  • 2661. 找出叠涂元素(哈希表、计数统计)
  • 1094. 拼车(差分)
  • 1423. 可获得的最大点数(滑动窗口)

907. 子数组的最小值之和(单调栈+贡献法)

https://leetcode.cn/problems/sum-of-subarray-minimums/description/?envType=daily-question&envId=2023-11-27

在这里插入图片描述

提示:

1 <= arr.length <= 3 * 10^4
1 <= arr[i] <= 3 * 10^4

class Solution {private static final int MOD = (int)1e9 + 7;public int sumSubarrayMins(int[] arr) {long ans = 0;           // 使用long总归是有利于避免溢出int n = arr.length;// 计算每个数字作为最小值的贡献,即找到左右两侧第一个小于它的(一边严格小于,另一边小于等于)Deque<Integer> stk = new ArrayDeque();int[] right = new int[n], left = new int[n];Arrays.fill(left, -1);Arrays.fill(right, n);for (int i = 0; i < n; ++i) {while (!stk.isEmpty() && arr[i] <= arr[stk.peek()]) {right[stk.pop()] = i;}if (!stk.isEmpty()) left[i] = stk.peek();stk.push(i);}for (int i = 0; i < n; ++i) {ans = (ans + (long)arr[i] * (right[i] - i) * (i - left[i])) % MOD;}return (int)ans;}
}

1670. 设计前中后队列⭐(设计数据结构)

https://leetcode.cn/problems/design-front-middle-back-queue/description/?envType=daily-question&envId=2023-11-28

在这里插入图片描述

提示:

1 <= val <= 10^9
最多调用 1000 次 pushFront, pushMiddle, pushBack, popFront, popMiddle 和 popBack 。

解法1——双向链表

自己写的代码如下:

class FrontMiddleBackQueue {Node head = new Node(), tail = new Node();int sz = 0;public FrontMiddleBackQueue() {head.next = tail;tail.prev = head;}public void pushFront(int val) {Node node = new Node(val, head, head.next);head.next.prev = node;head.next = node;sz++;}public void pushMiddle(int val) {Node cur = head;for (int i = 0; i < sz / 2; ++i) {cur = cur.next;}Node node = new Node(val, cur, cur.next);cur.next.prev = node;cur.next = node;sz++;}public void pushBack(int val) {Node node = new Node(val, tail.prev, tail);tail.prev.next = node;tail.prev = node;sz++;}public int popFront() {if (sz == 0) return -1;int res = head.next.val;head.next.next.prev = head;head.next = head.next.next;--sz;return res;}public int popMiddle() {if (sz == 0) return -1;Node cur = head;for (int i = 0; i < (sz - 1) / 2; ++i) cur = cur.next;int res = cur.next.val;cur.next.next.prev = cur;cur.next = cur.next.next;--sz;return res;}public int popBack() {if (sz == 0) return -1;int res = tail.prev.val;tail.prev.prev.next = tail;tail.prev = tail.prev.prev;--sz;return res;}
}class Node {int val = -1;Node prev = null, next = null;Node() {};Node(int _val, Node _prev, Node _next) {this.val = _val;this.prev = _prev;this.next = _next;}
}/*** Your FrontMiddleBackQueue object will be instantiated and called as such:* FrontMiddleBackQueue obj = new FrontMiddleBackQueue();* obj.pushFront(val);* obj.pushMiddle(val);* obj.pushBack(val);* int param_4 = obj.popFront();* int param_5 = obj.popMiddle();* int param_6 = obj.popBack();*/

一种优化方法是额外一个指针指向中间节点,参见:https://leetcode.cn/problems/design-front-middle-back-queue/solutions/502014/she-ji-qian-zhong-hou-dui-lie-by-zerotrac2/?envType=daily-question&envId=2023-11-28 的方法二。

解法2——两个双端队列

参考官方题解的思想 和 0x3f的代码写的。

class FrontMiddleBackQueue {// 左边的双端队列和右边的双端队列等长 或恰好大1。可以保证中间节点是左队列的结尾节点Deque<Integer> left = new ArrayDeque<>(), right = new ArrayDeque<>();public FrontMiddleBackQueue() {}public void pushFront(int val) {left.addFirst(val);balance();}public void pushMiddle(int val) {if (left.size() > right.size()) right.offerFirst(left.pollLast());left.offerLast(val);}public void pushBack(int val) {right.offerLast(val);balance();}public int popFront() {if (left.isEmpty()) return -1;int res = left.pollFirst();balance();return res;}public int popMiddle() {if (left.isEmpty()) return -1;int res = left.pollLast();balance();return res;}public int popBack() {if (left.isEmpty()) return -1;int res = right.isEmpty()? left.pollLast(): right.pollLast();balance();return res;}// 保持两个队列的相对大小public void balance() {if (left.size() > right.size() + 1) {right.offerFirst(left.pollLast());} else if (left.size() < right.size()) {left.offerLast(right.pollFirst());}}
}/*** Your FrontMiddleBackQueue object will be instantiated and called as such:* FrontMiddleBackQueue obj = new FrontMiddleBackQueue();* obj.pushFront(val);* obj.pushMiddle(val);* obj.pushBack(val);* int param_4 = obj.popFront();* int param_5 = obj.popMiddle();* int param_6 = obj.popBack();*/

2336. 无限集中的最小数字

https://leetcode.cn/problems/smallest-number-in-infinite-set/description/?envType=daily-question&envId=2023-11-29

在这里插入图片描述

解法1——维护最小变量mn 和 哈希表维护已经去掉的数字

维护最小变量mn,哈希表记录已经去除的数字。
当新添加数字时,如果更小,则更新 mn 变量。

class SmallestInfiniteSet {int mn = 1;Set<Integer> mv = new HashSet<>();public SmallestInfiniteSet() {}public int popSmallest() {int res = mn;mv.add(mn);while (mv.contains(mn)) mn++;return res;}public void addBack(int num) {if (mv.contains(num)) {mv.remove(num);if (num < mn) mn = num;}}
}/*** Your SmallestInfiniteSet object will be instantiated and called as such:* SmallestInfiniteSet obj = new SmallestInfiniteSet();* int param_1 = obj.popSmallest();* obj.addBack(num);*/

解法2——维护原本可用的最小值 和 有序集合维护后期添加的数值👌

去除时 是 去除最小的。
添加时 也只能添加 当前没有的,也是小的。

用一个变量维护上界,用一个有序集合维护新加的可用小数据。

class SmallestInfiniteSet {private int thres;private TreeSet<Integer> set;public SmallestInfiniteSet() {thres = 1;set = new TreeSet<Integer>();}public int popSmallest() {if (set.isEmpty()) {int ans = thres;++thres;return ans;}int ans = set.pollFirst();return ans;}public void addBack(int num) {if (num < thres) {set.add(num);}}
}

1657. 确定两个字符串是否接近(理解操作本质)⭐

https://leetcode.cn/problems/determine-if-two-strings-are-close/description/?envType=daily-question&envId=2023-11-30

在这里插入图片描述

提示:
1 <= word1.length, word2.length <= 10^5
word1 和 word2 仅包含小写英文字母

https://leetcode.cn/problems/determine-if-two-strings-are-close/solutions/2547579/li-jie-cao-zuo-ben-zhi-jian-ji-xie-fa-py-b18i/?envType=daily-question&envId=2023-11-30
在这里插入图片描述
在这里插入图片描述

class Solution {public boolean closeStrings(String word1, String word2) {if (word1.length() != word2.length()) return false;int sMask = 0, tMask = 0;int[] sCnt = new int[26], tCnt = new int[26];for (char ch: word1.toCharArray()) {sMask |= 1 << (ch - 'a');sCnt[ch - 'a']++;}for (char ch: word2.toCharArray()) {tMask |= 1 << (ch - 'a');tCnt[ch - 'a']++;}Arrays.sort(sCnt);Arrays.sort(tCnt);return sMask == tMask && Arrays.equals(sCnt, tCnt);}
}

2661. 找出叠涂元素(哈希表、计数统计)

https://leetcode.cn/problems/first-completely-painted-row-or-column/description/?envType=daily-question&envId=2023-12-01

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

m == mat.length
n = mat[i].length
arr.length == m * n
1 <= m, n <= 10^5
1 <= m * n <= 10^5
1 <= arr[i], mat[r][c] <= m * n
arr 中的所有整数 互不相同
mat 中的所有整数 互不相同

class Solution {public int firstCompleteIndex(int[] arr, int[][] mat) {int m = mat.length, n = mat[0].length;// 记录位置信息int[] c = new int[m * n + 1], r = new int[m * n + 1];for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {r[mat[i][j]] = i;c[mat[i][j]] = j;}}// 计数统计int[] cc = new int[n], rc = new int[m];for (int i = 0; i < m * n; ++i) {int v = arr[i], row = r[v], col = c[v];cc[col]++;rc[row]++;if (cc[col] == m || rc[row] == n) return i;}return -1;}
}

1094. 拼车(差分)

https://leetcode.cn/problems/car-pooling/description/?envType=daily-question&envId=2023-12-02

在这里插入图片描述

提示:

1 <= trips.length <= 1000
trips[i].length == 3
1 <= numPassengersi <= 100
0 <= fromi < toi <= 1000
1 <= capacity <= 10^5

用差分 表示 from 到 to 的范围内增加了多少人,然后再还原。

class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] diff = new int[1001];for (int[] t: trips) {diff[t[1]] += t[0];diff[t[2]] -= t[0];}int s = 0;for (int i = 0; i < 1001; ++i) {s += diff[i];if (s > capacity) return false;}return true;}
}

1423. 可获得的最大点数(滑动窗口)

https://leetcode.cn/problems/maximum-points-you-can-obtain-from-cards/description/?envType=daily-question&envId=2023-12-03

在这里插入图片描述
提示:
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length

就是找到长度为 n - k ,和最小的窗口,答案是 sum - mn。

class Solution {public int maxScore(int[] cardPoints, int k) {int n = cardPoints.length, sum = 0, s = 0, mn = Integer.MAX_VALUE / 2;if (k == n) return Arrays.stream(cardPoints).sum();k = n - k;for (int l = 0, r = 0; r < n; ++r) {s += cardPoints[r];sum += cardPoints[r];if (r - l + 1 == k) {mn = Math.min(mn, s);s -= cardPoints[l++];}}return sum - mn;}
}

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

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

相关文章

二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目

作者推荐 贪心算法LeetCode2071:你可以安排的最多任务数目 本文涉及的基础知识点 二分查找算法合集 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整数…

response应用及重定向和request转发

请求和转发&#xff1a; response说明一、response文件下载二、response验证码实现1.前置知识&#xff1a;2.具体实现&#xff1a;3.知识总结 三、response重定向四、request转发五、重定向和转发的区别 response说明 response是指HttpServletResponse,该响应有很多的应用&…

JavaScript 一些少见多怪的玩意

$$() [].forEach.call($$("*"), function (a) {a.style.outline "1px solid #" (~~(Math.random() * (1 << 24))).toString(16);}); 直接复制到控制台&#xff0c;页面效果就是页面中不同的HTML结构被不同颜色的框圈着。 原理&#xff1a; $$函数…

力扣面试150题 | 轮转数组

力扣面试150题 &#xff5c; 轮转数组 题目描述解题思路代码实现 题目描述 189.轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮…

Kafka在微服务架构中的应用:实现高效通信与数据流动

微服务架构的兴起带来了分布式系统的复杂性&#xff0c;而Kafka作为一款强大的分布式消息系统&#xff0c;为微服务之间的通信和数据流动提供了理想的解决方案。本文将深入探讨Kafka在微服务架构中的应用&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地理解和应…

PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)

使用PPLCNet模型对车辆朝向进行识别 1 准备环境2 准备模型2.1 模型导出2.2 修改配置文件3 编译3.1 使用CMake生成项目文件3.2 编译3.3 执行3.4 添加后处理程序3.4.1 postprocess.h3.4.2 postprocess.cpp3.4.3 在cls.h中添加函数声明3.4.4 在cls.cpp中添加函数定义3.4.5 在main.…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 VMD经验模态分解 3 构造训练数据 4 LSTM模型训练 5 预测 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt f…

优化算法 学习记录

文章目录 相关资料 优化算法梯度下降学习率牛顿法 随机梯度下降小批量随机梯度下降动量法动量法解决上述问题 AdaGrad 算法RMSProp算法Adam学习率调度器余弦学习率调度预热 相关资料 李沐 动手学深度学习 优化算法 优化算法使我们能够继续更新模型参数&#xff0c;并使损失函…

Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 来实现 Chatbot

Elasticsearch 的向量搜索为我们的语义搜索提供了可能。而在人工智能的动态格局中&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation - RAG&#xff09;已经成为游戏规则的改变者&#xff0c;彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模…

Android TextView 超出省略失效 解决方法

解决方法 我是在使用 ConstraintLayout 嵌套 LinearLayout 水平方向&#xff0c;TextView 又使用layout_weight&#xff08;权重&#xff09;情况下出现这种问题&#xff0c;最后将layout_width从 0dp 改为 1dp 得以解决。 <androidx.constraintlayout.widget.ConstraintLa…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…

当年为什么选择计算机?

确切的来说不是远的计算机&#xff0c;高考那会计算机很热门&#xff0c;根本考不上&#xff01;学习了一个和计算机关系很密切的专业&#xff0c;编程搞得好&#xff0c;才能找到好工作&#xff0c;才能有饭吃&#xff01;记得当年我还跑去武汉大学的计算机课堂和人家一起听课…

导入自定义模块出现红色波浪线,但是能正常执行

问题描述&#xff1a; 导入自己定义的模块时&#xff0c;出现红色波浪线&#xff0c;可以继续执行 解决&#xff1a; 在存放当前执行文件的文件夹右键&#xff0c;然后将其设置为sources root即可 结果&#xff1a;

基于深度学习yolov5实现安全帽人体识别工地安全识别系统-反光衣识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 实现安全帽人体识别工地安全识别系统需要使用深度学习技术&#xff0c;特别是YOLOv5算法。下面是对基于YOLOv5实现安…

带你真正理解web地图切片规则

很多时候我们即使做完了项目还是对切片规则一知半解&#xff0c;只知道照着例子写代码&#xff0c;不理解WMTSCapabilities文件中参数的具体含义&#xff0c;也无法理解切片规则是如何产生的&#xff0c;不知道经纬度切图和平面切图的差别是啥&#xff0c;等等种种疑问&#xf…

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

Vue学习笔记-Vue3中setup函数注意点

setup编写示例 <script> import {reactive} from vue export default {name: "DemoVue",props:[xxx,yy,...],setup(props,context){const data reactive({......})//setup必须有返回值return {data,}} } </script>setup执行的时机 在beforeCreate()之…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

python基于DeeplabV3Plus开发构建手机屏幕表面缺陷图像分割识别系统

Deeplab是图像分割领域非常强大的模型&#xff0c;在前面的博文中我们也进行过很多相应项目的开发实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于DeepLabv3Plus开发构建人脸人像分割系统》 《基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割》 《基于D…

【链表Linked List】力扣-203 移除链表元素

目录 题目描述 解题过程 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5…