每日算法刷題Day38 6.25:leetcode前綴和3道題,用時1h40min

5. 1749.任意子數組和的絕對值的最大值(中等,學習)

1749. 任意子數組和的絕對值的最大值 - 力扣(LeetCode)

思想

1.給你一個整數數組 nums 。一個子數組 [numsl, numsl+1, ..., numsr-1, numsr]和的絕對值abs(numsl + numsl+1 + ... + numsr-1 + numsr)
請你找出 nums和的絕對值 最大的任意子數組(可能為空),并返回該 最大值
abs(x) 定義如下:

  • 如果 x 是負整數,那么 abs(x) = -x
  • 如果 x 是非負整數,那么 abs(x) = x
    2.此題**abs(numsl + numsl+1 + ... + numsr-1 + numsr)轉化為abs(s[r+1]-s[l])的最大值,即一個s數組,選取兩個元素,讓他們兩個差的絕對值最大,所以為s數組的最大值mx減去s數組的最小值mn**,因為子數組可能為空(即s[0]=0),所以mx,mn初始化為0
    3.此題轉化的含義為:
  • 變成一條曲線,表示和的累計值,然后mx,mn就是最大值點和最小值點,他們直接的區間就是這個子數組和的累計值,表示他們的變化量最大(絕對值)
  • mx的坐標>mn的坐標,表示正的和的最大值
  • mx的坐標<mn的坐標,表示負的和的最小值,絕對值變成最大值
代碼

c++:

class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {int n = nums.size();int s = 0, mx = 0,mn = 0; // s[0]=0,所以mx,mn初始值為0,因為子數組可能為空for (int i = 0; i < n; ++i) {s += nums[i];mx = max(mx, s);mn = min(mn, s);}return mx - mn;}
};
6. 2389.和有限的最長子序列(簡單,想到二分查找優化)

2389. 和有限的最長子序列 - 力扣(LeetCode)

思想

1.給你一個長度為 n 的整數數組 nums ,和一個長度為 m 的整數數組 queries
返回一個長度為 m 的數組 answer ,其中 answer[i]nums 中 元素之和小于等于 queries[i]子序列最大 長度 。
子序列 是由一個數組刪除某些元素(也可以不刪除)但不改變剩余元素順序得到的一個數組。
2.因為是子序列,所以是任意選取的,不要求連續,只要找到一個子序列能夠滿足條件就可以更新長度,所以貪心思想元素越小越好,所以先對nums數組排序,然后求得前綴和s數組,接下來就是尋找最后一個滿足s[tmp]<=queries[i]的下標tmp,因為s數組是有序的,所以可以將順序查找優化為二分查找,因為s[tmp]對應nums[0...tmp-1]數組和,長度就為tmp

代碼

c++:

class Solution {
public:vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {int n = nums.size(), m = queries.size();sort(nums.begin(), nums.end());vector<int> s(n + 1);s[0] = 0;for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}vector<int> res;for (int i = 0; i < m; ++i) {int j = 0;while (j + 1 < n + 1 && s[j + 1] <= queries[i])++j;res.emplace_back(j);}return res;}
};

二分優化:

class Solution {
public:vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {int n = nums.size(), m = queries.size();sort(nums.begin(), nums.end());vector<int> s(n + 1);s[0] = 0;for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}vector<int> res;for (int i = 0; i < m; ++i) {int left = 0, right = n, tmp = 0;while (left <= right) {int mid = left + ((right - left) >> 1);// 找到滿足條件的,更新答案,找更大的if (s[mid] <= queries[i]) {tmp = mid;left = mid + 1;} elseright = mid - 1;}// s[tmp]:nums[0...tmp-1]長度為tmpres.emplace_back(tmp);}return res;}
};
7. 3361.兩個字符串的切換距離(中等,學習環形延長一倍變成非環形)

3361. 兩個字符串的切換距離 - 力扣(LeetCode)

思想

1.給你兩個長度相同的字符串 st ,以及兩個整數數組 nextCostpreviousCost
一次操作中,你可以選擇 s 中的一個下標 i ,執行以下操作 之一

  • s[i] 切換為字母表中的下一個字母,如果 s[i] == 'z' ,切換后得到 'a' 。操作的代價為 nextCost[j] ,其中 j 表示 s[i] 在字母表中的下標。
  • s[i] 切換為字母表中的上一個字母,如果 s[i] == 'a' ,切換后得到 'z' 。操作的代價為 previousCost[j] ,其中 js[i] 在字母表中的下標。
    切換距離 指的是將字符串 s 變為字符串 t最少 操作代價總和。
    請你返回從 st切換距離
    2.就是提前計算出nextCost和previousCost的前綴和數組,然后分類討論考慮時要考慮清楚區間范圍是什么,然后決定前綴和數組的下標
    3.字母表是環形的,可以把前綴和數組延長一倍,可以大大簡化討論
代碼

c++:

class Solution {
public:long long shiftDistance(string s, string t, vector<int>& nextCost,vector<int>& previousCost) {long long res = 0;int n = s.size();vector<long long> sNext(27);vector<long long> sPre(27);sNext[0] = 0;sPre[0] = 0;for (int i = 0; i < 26; ++i) {sNext[i + 1] = sNext[i] + nextCost[i];sPre[i + 1] = sPre[i] + previousCost[i];}for (int i = 0; i < n; ++i) {int ids = s[i] - 'a', idt = t[i] - 'a';long long mn = 0;if (ids < idt) {// 向后:nextCost[ids...idt-1],向前排除:preCost[ids+1...idt]mn = min(sNext[idt] - sNext[ids],sPre[26] - (sPre[idt + 1] - sPre[ids + 1]));}// 向前:PreCost[idt+1..ids],向后排除:nextCost[idt...ids-1]elsemn = min(sPre[ids + 1] - sPre[idt + 1],sNext[26] - (sNext[ids] - sNext[idt]));res += mn;}return res;}
};

延長一倍優化循環數組:

class Solution {
public:long long shiftDistance(string s, string t, vector<int>& nextCost,vector<int>& previousCost) {long long res = 0;int n = s.size();const int SIGMA = 26;vector<long long> sNext(2 * SIGMA + 1, 0);vector<long long> sPre(2 * SIGMA + 1, 0);sNext[0] = 0;sPre[0] = 0;for (int i = 0; i < 2 * SIGMA; ++i) {sNext[i + 1] = sNext[i] + nextCost[i % SIGMA];sPre[i + 1] = sPre[i] + previousCost[i % SIGMA];}for (int i = 0; i < n; ++i) {int x = s[i] - 'a', y = t[i] - 'a';// 向后是ids->idt-1,所以s數組是ids->idt,向前是idt+1->ids,所以s數組是idt+1->ids+1// sNext只有y<x時,y才加;sPre只有x<y時,x才加res += min(sNext[y < x ? y + SIGMA : y] - sNext[x],sPre[(x < y ? x + SIGMA : x) + 1] - sPre[y + 1]);}return res;}
};

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

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

相關文章

創客匠人視角下創始人 IP 打造的底層邏輯與實踐路徑

在知識付費行業蓬勃發展的當下&#xff0c;創始人 IP 已成為連接用戶與商業價值的核心紐帶。創客匠人創始人老蔣在與行業頭部 IP 洪鑫的對話中揭示了一個關鍵命題&#xff1a;IP 打造的成敗&#xff0c;始于發心與理念的根基。從洪鑫教育中心營收超 6000 萬的案例來看&#xff…

2022/7 N2 jlpt詞匯

気力&#xff08;きりょく&#xff09; 清く&#xff08;きよく&#xff09; 記録&#xff08;きろく&#xff09; 記憶&#xff08;きおく&#xff09; 賢い&#xff08;かしこい&#xff09; 偉い&#xff08;えらい&#xff09; 凄い&#xff08;すごい&#xff09; 鋭い&am…

系統性能優化-8 TCP緩沖區與擁塞控制

每個 TCP 連接都有發送緩沖區和接收緩沖區&#xff0c;發送緩沖區存已發送未確認數據和待發送數據&#xff0c;接收緩沖區存接收但是沒有被上層服務讀取的數據。 # cat /proc/net/sockstat sockets: used 1885 TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表當前…

【前端】vue工程環境配置

環境準備(Windows版本) nodejs安裝 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?為什么需要它?它能解決什么問題?

Data Version Control (DVC) 是一個開源工具&#xff0c;專為數據科學和機器學習項目設計。它的核心目標是像 Git 管理代碼一樣來管理機器學習項目中的數據和模型文件。 簡單來說&#xff0c;DVC 是什么&#xff1f; Git for Data & Models&#xff1a; 它擴展了 Git 的功…

簡約計生用品商城簡介

計生用品商城簡介&#xff1a;uniapp結合thinkphp實現的全開源代碼&#xff0c; 內置基本功能&#xff1a;1.后臺商品excel一鍵導入 2.分銷利潤&#xff0c;按照利潤加個分紅

go中自動補全插件安裝-gopls

vscode中安裝gopls失敗&#xff0c;導致go中代碼無提示&#xff0c;無法自動補全引用 環境變量中設置go的代理&#xff1a;setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣尋找數組中心索引-性能優化思考

如下代碼 var pivotIndex function(nums) {// 空數組返回-1if (nums.length 0) return -1// 計算數組總和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍歷數組查找中心索引for (let i 0; i < nums.length; i) {// 右側和 總和 - 左側…

SVN 分支管理(本文以Unity項目為例)

文章目錄 1.準備工作2.新建SVN倉庫2.拉取遠端空 trunk 到Unity項目目錄下3.設置忽略&#xff0c;提交unity項目至倉庫3.創建分支4.切換分支5.合并分支回主干&#xff08;例如將 trunk_01 合并回 trunk&#xff09;5.刪除分支&#xff08;可選&#xff09; 1.準備工作 下載Tort…

數據結構學習day6---流+讀寫函數+緩沖+定義函數

目錄 1.標準io&#xff1b; stdio.h 1.1標準io的概念 1.2Linux操作系統當中IO都是對文件的操作 1.3標準IO&#xff1a;ANSI C 設計的一組用文件IO 封裝的操作庫函數 2.文件 2.1作用 2.2linux中文件的類型 3.man 5.流: FILE* 5.1流的定義 5.2流的分類 6.c語言文…

互聯網醫院,正在發生的醫療新變革

隨著信息技術的飛速發展&#xff0c;互聯網醫院作為醫療服務的新形態&#xff0c;正在全球范圍內迅速崛起。在中國&#xff0c;這一變革尤為顯著&#xff0c;互聯網醫院不僅改善了醫療服務的可及性和便捷性&#xff0c;還極大地提升了醫療服務的質量和效率。 一、互聯網醫院的發…

rabbitmq動態創建交換機、隊列、動態綁定,銷毀

// 緩存已創建的綁定&#xff0c;避免重復聲明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代碼倉庫導入自建gitlab中

登錄自建GitLab 在瀏覽器中輸入GitLab訪問地址http://192.168.1.111:81/users/sign_in&#xff0c;輸入賬號和密碼登錄GitLab服務&#xff0c;如下圖&#xff1a; 新建一個空的代碼庫 按照以下截圖順序&#xff0c;創建一個新的空項目&#xff0c;如下&#xff1a; 克隆鏡像 …

業界優秀的零信任安全管理系統產品介紹

騰訊 iOA 零信任安全管理系統 簡介&#xff1a;騰訊 iOA 零信任安全管理系統是騰訊終端安全團隊針對企業安全上云和數字化轉型&#xff0c;提供的企業網絡邊界處的應用訪問管控系統&#xff0c;為企業應用提供統一、安全、高效的訪問入口&#xff0c;同時提供終端安全加固、軟…

從設計到開發一個小程序頁面

巧婦難為無米之炊&#xff0c;想寫功能但是沒有好看的設計&#xff0c;邊寫邊設計效率又不夠高。mastergoAi生成的頁面又不夠好看&#xff0c;而且每月給的免費積分用得又超快&#xff0c;so決定自給自足。能有多難&#xff0c;先做&#xff0c;做了再改。 于是決定踏足設計&a…

Linux系統 / Ubuntu虛擬機 安裝DHCP服務

一、安裝DHCP服務 xxx:~$ sudo apt install isc-dhcp-server 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 將會同時安裝下列軟件&#xff1a; libirs-export161 libisccfg-export163 建議安裝&#xff1a; isc-dhcp-s…

Spring中 BeanFactory和FactoryBean分別是什么?

Spring 中 BeanFactory 是什么? BeanFactory其實就是IoC的底層容器&#xff0c;它本身只是一個接口&#xff0c;顧名思義Bean工廠&#xff0c;定義了Spring的基本功能框架&#xff0c;主要功能就是 負責從配置源中讀取 Bean 的定義&#xff0c;并創建、管理這些 Bean 的生命周…

langchain從入門到精通(三十二)——RAG優化策略(八)自查詢檢索器實現動態數據過濾

1. 查詢構建與自查詢檢索器 在 RAG 應用開發中&#xff0c;檢索外部數據時&#xff0c;前面的優化案例中&#xff0c;無論是生成的 子查詢、問題分解、生成假設性文檔&#xff0c;最后在執行檢索的時候使用的都是固定的篩選條件&#xff08;沒有附加過濾的相似性搜索&#xff…

面向安全產品測試的靜態混淆型 Shellcode Loader 設計與對抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、項目背景 近年來&#xff0c;隨著 C2 框架廣泛應用于安全對抗模擬&#xff0c;各大安全廠商也不斷提升其檢測能力&#xff0c;那么安全廠商自研的安全軟件&#xff0c;是否能有效防御此類威脅&…

深度強化學習DRL——策略學習

一、策略網絡 策略函數 π \pi π的輸入是狀態 s s s和動作 a a a&#xff0c;輸出是一個介于0和1之間的概率值&#xff0c;用神經網絡 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函數 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …