【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.pswp.cn/news/208809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208809.shtml
英文地址,請注明出處:http://en.pswp.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…