每日算法刷題Day35 6.22:leetcode枚舉技巧枚舉中間2道題,用時1h

枚舉中間

對于三個或者四個變量的問題,枚舉中間的變量往往更好算。
為什么?比如問題有三個下標,需要滿足 0≤i<j<k<n,對比一下:
枚舉 i,后續計算中還需保證 j<k。
枚舉 j,那么 i 和 k 自動被 j 隔開,互相獨立,后續計算中無需關心 i 和 k 的位置關系。
所以枚舉中間的變量更簡單。

1.套路
class Solution {
public:int minimumSum(vector<int>& nums) {int n=nums.size();// 后綴數組維護k的最小值vector<int> sufMin(n,0);sufMin[n-1]=nums[n-1];for(int i=n-2;i>=0;--i){sufMin[i]=min(sufMin[i+1],nums[i]);}int preMin=nums[0],res=INT_MAX;// 枚舉j,注意j范圍[1,n-1)for(int j=1;j+1<n;++j){if(nums[j]>preMin && nums[j]>sufMin[j+1])   res=min(res,preMin+nums[j]+sufMin[j+1]);// 單變量維護i的最小值preMin=min(preMin,nums[j]);}if(res==INT_MAX)    return -1;else    return res;}
};
2.題目描述

1.給你一個下標從?0?開始的整數數組?nums?。
如果下標三元組?(i, j, k)?滿足下述全部條件(題目條件),則認為它是一個?山形三元組?:

  • i < j < k
  • nums[i] < nums[j]?且?nums[k] < nums[j]
    請你找出?nums?中?元素和最小?的山形三元組,并返回其?元素和(答案)?。如果不存在滿足條件的三元組,返回?-1?。
    2.給你一個整數數組?nums
    特殊三元組?**定義為(題目條件)**滿足以下條件的下標三元組?(i, j, k)
  • 0 <= i < j < k < n,其中?n = nums.length
  • nums[i] == nums[j] * 2
  • nums[k] == nums[j] * 2
    返回數組中?特殊三元組的總數(答案)
    由于答案可能非常大,請返回結果對?109 + 7?取余數后的值。
3.學習經驗

1.i的維護跟枚舉右,維護左一樣,可以隨著j的枚舉而動態更新,所以可以用單變量或者map(更新答案后加入j)實現,但k的維護需要在枚舉j之前完成,通常要借助數組和map(更新答案前刪去j),無法用一個變量實現

1. 2909.元素和最小的山形三元組II(中等,學習,前后綴最小值維護)

2909. 元素和最小的山形三元組 II - 力扣(LeetCode)

思想

1.給你一個下標從?0?開始的整數數組?nums?。
如果下標三元組?(i, j, k)?滿足下述全部條件,則認為它是一個?山形三元組?:

  • i < j < k
  • nums[i] < nums[j]?且?nums[k] < nums[j]
    請你找出?nums?中?元素和最小?的山形三元組,并返回其?元素和?。如果不存在滿足條件的三元組,返回?-1?。
    2.這題三個變量,所以要枚舉中間變量j,而nums[i]的最小值維護可以跟著j的枚舉一起更新,所以只需要一個變量preMin即可,但是nums[j+1]-nums[n-1]的最小值無法只用一個變量維護,需要提前遞推算出后綴最小值(類似于前綴和),令 s u f M i n [ i ] sufMin[i] sufMin[i]表示[i,n)的最小值,所以得到遞推公式:
    s u f M i n [ i ] = m i n ( s u f M i n ( i + 1 ) , n u m s [ i ] ) sufMin[i]=min(sufMin(i+1),nums[i]) sufMin[i]=min(sufMin(i+1),nums[i]),從后向前更新,在枚舉j前維護即可
    3.所以滿足山形條件為:
nums[j]>preMin && nums[j]>sufMin[j+1]

更新答案:

res=min(res,pre+nums[j]+sufMin[j+1])

更新preMin:

preMin=min(preMin,nums[j])
代碼

c++:

class Solution {
public:int minimumSum(vector<int>& nums) {int n=nums.size();// 后綴數組維護k的最小值vector<int> sufMin(n,0);sufMin[n-1]=nums[n-1];for(int i=n-2;i>=0;--i){sufMin[i]=min(sufMin[i+1],nums[i]);}int preMin=nums[0],res=INT_MAX;// 枚舉j,注意j范圍[1,n-1)for(int j=1;j+1<n;++j){if(nums[j]>preMin && nums[j]>sufMin[j+1])   res=min(res,preMin+nums[j]+sufMin[j+1]);// 單變量維護i的最小值preMin=min(preMin,nums[j]);}if(res==INT_MAX)    return -1;else    return res;}
};
2. 3583.統計特殊三元組(中等)

3583. 統計特殊三元組 - 力扣(LeetCode)

思想

1.給你一個整數數組?nums
特殊三元組?定義為滿足以下條件的下標三元組?(i, j, k)

  • 0 <= i < j < k < n,其中?n = nums.length
  • nums[i] == nums[j] * 2
  • nums[k] == nums[j] * 2
    返回數組中?特殊三元組?的總數。
    由于答案可能非常大,請返回結果對?109 + 7?取余數后的值。
    2.學習1. 2909.元素和最小的山形三元組II的思想,本題需要知道[0,j-1]nums[j]*2的個數和[j+1,n)nums[j]*2的個數,前者就是正常的枚舉右,維護左會用到的map技巧,后者也可以利用這個思想,不過我的代碼復雜了,還開了一個數組來計算,可以直接用map,再計算答案前先把nums[j]減去即可,而前者是計算答案后要把nums[j]加上,因為枚舉j,所以i和k相互獨立,用乘法原理相乘即可
代碼

c++:
我的代碼

class Solution {
public:int specialTriplets(vector<int>& nums) {const int mod = 1e9 + 7;int n = nums.size();map<long long, long long> suf;  // 維護k,數-個數vector<long long> sufCnt(n, 0); // 維護k,個數map<long long, long long> pre;  // 維護i,數-個數for (int i = n - 1; i >= 0; --i) {sufCnt[i] = suf[2 * nums[i]];++suf[nums[i]];}long long res = 0;++pre[nums[0]];for (int j = 1; j + 1 < n; ++j) {res = (res + pre[nums[j] * 2] * sufCnt[j]) % mod;++pre[nums[j]];}return res;}
};

優化:

class Solution {
public:int specialTriplets(vector<int>& nums) {const int mod = 1e9 + 7;int n = nums.size();map<long long, long long> suf; // 維護k,數-個數map<long long, long long> pre; // 維護i,數-個數// 跟下面j的范圍一樣for (int j = 1; j < n; ++j)++suf[nums[j]];long long res = 0;++pre[nums[0]];for (int j = 1; j + 1 < n; ++j) {--suf[nums[j]];res = (res + pre[nums[j] * 2] * suf[nums[j] * 2]) % mod;++pre[nums[j]];}return res;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84930.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【教學類-18-06】20250623蒙德里安黑白七款合并WORD(500張、無學號)

背景需要 客戶買了蒙德里安黑白格子7種尺寸,但是不需要學號方塊,并指定要WORD 設計思路 【教學類-18-05】20241118正方形手工紙(蒙德里安-風格派-紅黃藍黑白)-CSDN博客文章瀏覽閱讀1.3k次,點贊29次,收藏18次。【教學類-18-05】20241118正方形手工紙(蒙德里安-風格派-紅…

langchain--(4)

7 Embedding文本向量化 Embedding文本向量化是一種將非結構化文本轉化為低維、連續數值向量的技術,旨在通過數學方式捕捉文本的語義、語法或特征信息,從而讓機器更高效地處理語言任務。其核心思想源于流形假設(Manifold Hypothesis),即認為高維原始數據(如文本)實際隱含…

DMDRS部署實施手冊(ORACLE=》DM)

DMDRS部署實施手冊&#xff08;ORACLE》DM&#xff09; 1 同步說明2 DMDRS安裝3 數據庫準備3.1 源端準備3.1.1 開啟歸檔日志和附加日志3.1.2 關閉回收站3.1.3 創建同步用戶 3.2 目標準備3.2.1 創建同步用戶 4 DMDRS配置4.1 源端配置4.2 目標配置 5 DMDRS啟動5.1 啟動源端服務5.…

十(1)作業:sqli-labs重點關卡

參考文章&#xff1a;詳細sqli-labs&#xff08;1-65&#xff09;通關講解-CSDN博客 第1關&#xff1a; 輸入 &#xff1a; ?id3 輸入 &#xff1a; ?id2 當輸入的數字不同&#xff0c;頁面的響應也不同&#xff0c;說明&#xff0c;輸入的內容被帶入到數據庫里查詢了 輸…

Python 爬蟲入門 Day 7 - 復盤 + 實戰挑戰日

Python 第二階段 - 爬蟲入門 &#x1f3af; 本周知識回顧 網絡請求與網頁結構基礎 HTML解析入門&#xff08;使用 BeautifulSoup&#xff09; 實現爬蟲多頁抓取與翻頁邏輯 模擬登錄爬蟲與 Session 維持 使用 XPath 進行網頁解析&#xff08;lxml XPath&#xff09; 反爬蟲應對…

WebRTC(七):媒體能力協商

目的 在 WebRTC 中&#xff0c;每個瀏覽器或終端支持的音視頻編解碼器、分辨率、碼率、幀率等可能不同。媒體能力協商的目的就是&#xff1a; 確保雙方能“聽得懂”對方發的媒體流&#xff1b;明確誰發送、誰接收、怎么發送&#xff1b;保障連接的互操作性和兼容性。 P2P的基…

可信啟動方案設計

安全之安全(security)博客目錄導讀 目錄 一、引言 二、關鍵數據(Critical Data) 三、度量槽(Measurement Slot) 四、可信啟動后端 1、事件日志(Event Log) 2、離散型 TPM(Discrete TPM) 3、RSE(運行時安全引擎) 五、平臺接口 平臺接口的職責: 1、函數:b…

?通義萬相2.1深度解析:AI視頻生成引擎FLF2V-14B全流程指南(命令行參數+模型架構+數據流)

&#x1f31f; 從零詳解&#xff1a;如何用AI模型生成視頻&#xff1f;命令行、模型結構、數據流全解析&#xff01; 本文通過一個實際案例&#xff0c;詳細解析使用AI模型生成視頻的整個流程。從命令行參數解讀到模型結構&#xff0c;再到數據在模型間的流動&#xff0c;一步步…

在 TypeScript 前端中使用 Umi-Request 調用 Java 接口的完整指南

下面我將詳細介紹如何在基于 TypeScript 的前端項目中使用 umi-request 調用 IntelliJ IDEA 中開發的 Java 接口&#xff0c;包括完整的實現方案和代碼示例。 整體方案設計 一、Java 后端接口準備 1. 創建 Spring Boot 控制器 // src/main/java/com/example/demo/controller…

GO Gin Web框架面試題及參考答案

目錄 Gin 與 net/http 有哪些主要區別?為什么選擇 Gin? 如何使用 Gin 啟動一個 HTTP 服務并設置默認路由? Gin 的默認路由和自定義路由器組是如何工作的? 如何在 Gin 中綁定請求參數(Query、Form、JSON、XML)? 如何在 Gin 中使用中間件?中間件執行順序是怎樣的? …

asp.net core Razor動態語言編程代替asp.net .aspx更高級嗎?

For Each item In products<tr><td>item.Id</td><td>item.Name</td><td>item.Price.ToString("C")</td></tr>Next為什么要用<tr> ? 在Blazor的Razor語法中&#xff0c;使用<tr>是為了在VB.NET代碼塊中…

css語法中的選擇器與屬性詳解:嵌套聲明、集體聲明、全局聲明、混合選擇器

嵌套聲明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>嵌套聲明</title> <!-- 這里p span 的含義是p標簽下面的span標簽 所以有嵌套關系--><style>p span {font-weight:…

Linux 系統中,/usr/bin/ 和/bin/的區別?

在 Linux 系統中&#xff0c;/bin/ 和 /usr/bin/ 都是存放可執行程序&#xff08;命令&#xff09;的目錄&#xff0c;但它們在歷史定位、用途、掛載策略和系統設計上有一定區別。 ? 快速對比總結 項目/bin//usr/bin/全稱含義binary&#xff08;核心二進制&#xff09;user b…

蒼穹外賣--WebSocket、來單提醒、客戶催單

WebSocket 1.介紹 WebSocket是基于TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要一次握手&#xff0c;兩者之間就可以創建持久性的連接&#xff0c;并進行雙向數據傳送。 HTTP協議和WebSocket協議對比&#xff1a; ①Http是短連接 ②W…

Linux 信號(Signal)與信號量(Semaphore)區別

特性信號 (Signal)信號量 (Semaphore)本質軟件中斷進程間同步機制用途通知進程發生了某個事件控制對共享資源的訪問通信方向單向 (內核→進程 或 進程→進程)多進程共享數據類型整數信號編號內核維護的計數器持久性瞬時,不排隊持久,直到顯式釋放實現層次內核實現內核或用戶空…

華為OD機考-觀看文藝匯演問題-區間問題(JAVA 2025B卷)

import java.util.*; /*** version Ver 1.0* date 2025/6/20* description 觀看文藝匯演*/ public class WatchMovie {public static void main(String[] args) {Scanner sc new Scanner(System.in);int num Integer.parseInt(sc.nextLine());List<Movie> movies new …

DeepSeek今天喝什么隨機奶茶推薦器

用DeepSeek生成了一個隨機奶茶推薦器-今天喝什么&#xff0c;效果非常棒&#xff01;UI界面美觀。 提示詞prompt如下 用html5幫我生成一個今天喝什么的網頁 點擊按鈕隨機生成奶茶品牌等&#xff0c;要包括中國常見的知名的奶茶品牌 如果不滿意還可以隨機再次生成 ui界面要好看 …

【國產AI服務器】全國產PCIE5.0交換板,替代博通89104/89144,支持海光、龍芯等平臺

實物圖 核心硬件配置 1、控制器芯片? 采用國產TL63104控制芯片?&#xff0c;支持2.5GT/s、5GT/s、8GT/s、16GT/s、32GT/s的PCIe傳輸速率&#xff0c;支持968Lanes。支持6個x16的group和1個x8的group&#xff0c;每個group支持1至8個端口。x16group支持x16、x8、x4、x2端口…

GPIO-LED驅動

一、LED引腳說明 寄存器地址地圖&#xff1a; 原理圖&#xff1a; 關于MOS管的說明&#xff1a; 總結&#xff1a;當GPIO0_B5這個引腳輸出高電平的時候&#xff0c;對應的N-MOS管導通—LED點亮 當GPIO0_B5這個引腳輸出低電平的時候&#xff0c;對應的N-MOS管截止---LED熄滅 二…

Gartner《Generative AI Use - Case Comparison for Legal Departments》

概述 這篇文章由 Gartner, Inc. 出品,聚焦于生成式人工智能(GenAI)在法律部門中的應用情況,通過對 16 個較為突出的 GenAI 法律技術應用場景進行分析,從商業價值和可行性兩個維度進行評估,旨在為法律總顧問等提供戰略對話依據,以便更好地做出技術投資決策,推動法律部門…