LeetCode --- 156雙周賽

題目列表

3541. 找到頻率最高的元音和輔音
3542. 將所有元素變為 0 的最少操作次數
3543. K 條邊路徑的最大邊權和
3544. 子樹反轉和

一、找到頻率最高的元音和輔音

在這里插入圖片描述
分別統計元音和輔音的出現次數最大值,然后相加即可,代碼如下

// C++
class Solution {const string str = "aeiou";
public:int maxFreqSum(string s) {int cnt[26]{};int mx1 = 0, mx2 = 0;for(auto & e : s){cnt[e - 'a']++;if(str.find(e) == string::npos){mx1 = max(mx1, cnt[e - 'a']); // 更新輔音}else{mx2 = max(mx2, cnt[e - 'a']); // 更新輔音}}return mx1 + mx2;}
};
# Python
class Solution:def maxFreqSum(self, s: str) -> int:cnt = [0] * 26mx1 = 0mx2 = 0for e in s:x = ord(e) - ord('a')cnt[x] += 1if e in "aeiou":mx1 = max(mx1, cnt[x])else:mx2 = max(mx2, cnt[x])return mx1 + mx2

二、將所有元素變為 0 的最少操作次數

在這里插入圖片描述
本題的難點在于一旦我們將區間內的最小值變為 0,那么剩余的不為 0 的數字就會被分成一段一段的區間,此時,我們需要在這些區間內再去進行操作,而這需要我們維護區間內的最小值,顯然很困難,那有沒有什么其他的思路?

  • 思路
    對于一個數字 x 來說,只有當它是區間內的最小值時,才可以通過操作被置為 0,而從貪心的角度來說,這個區間越大,則置為 0 的數越多,所進行的操作就會越少。所以我們只要計算對于同一個數字 x,它需要被分為多少個區間,才能讓所有的 x 全部變為 0,而它分出的區間數就是它需要進行的最少操作次數。統計所有的數字對于答案的貢獻即可

    • 這里暗含一個貪心的策略,優先將小的數字置為 0 會更優,因為小的數字置為 0,它依舊是小的數字,不會影響大的數字的分區個數,但是反過來,大的數字置為 0,就有可能將小的數字分成更多的區間,導致操作次數變多
    • 故這里我們計算出每個數字區間個數后直接相加,看似不論順序,實質是從小的數字開始進行操作
    • 求解 x 為最小數字的區間,本質是求距離 x 最近的比它小的數字下標,可以用單調棧來求解
// C++
class Solution {
public:int minOperations(vector<int>& nums) {int n = nums.size();stack<int> st;vector<int> left(n, -1), right(n, n);// 計算區間for(int i = 0; i < n; i++){while(st.size() && nums[st.top()] > nums[i]){right[st.top()] = i;st.pop();}st.push(i);}st = stack<int>();for(int i = n - 1; i >= 0; i--){while(st.size() && nums[st.top()] > nums[i]){left[st.top()] = i;st.pop();}st.push(i);}unordered_map<int,set<pair<int,int>>> mp;for(int i = 0; i < n; i++){mp[nums[i]].emplace(left[i], right[i]);}int ans = 0;for(auto& [x, st] : mp){if(x){ // x = 0 不需要進行操作ans += st.size();}}return ans;}
};
  • 優化

    • 對于求區間個數的操作,我們可以在一次循環中得到,具體如下
// C++
class Solution {
public:int minOperations(vector<int>& nums) {int n = nums.size(), ans = 0;stack<int> st; // 單調遞增 & 棧中無重復數字 & 不包含 0for(int i = 0; i < n; i++){while(st.size() && nums[st.top()] >= nums[i]){// 這里只統計一定需要進行一次操作的數字個數,即左右邊界已經明確的數字// 和 nums[i] 相同的數字,由于右邊界還不確定,此處不統計,等區間明確后在統計if(nums[st.top()] != nums[i]){ans++;}st.pop();}if(nums[i]) // 0 不需要入棧st.push(i);}// 棧中剩余的數字,此時右邊界已經確定,也需要進行一次操作才能被置為 0return ans + st.size();}
};
#Python
class Solution:def minOperations(self, nums: List[int]) -> int:ans = 0bottom, top = 0, 0 # 可以直接將 nums 當作棧進行使用,空間復雜度為 O(1)for i in range(len(nums)):while bottom != top and nums[top-1] >= nums[i]:if nums[top-1] != nums[i]:ans += 1top -= 1if nums[i] > 0:nums[top] = nums[i]top += 1return ans + top - bottom

三、K 條邊路徑的最大邊權和

在這里插入圖片描述
本題先建圖,然后直接用 dfs 進行遍歷即可,注意,為了防止重復遍歷某個狀態,需要記憶化已經遍歷過的狀態,代碼如下

// C++
class Solution {
public:int maxWeight(int n, vector<vector<int>>& edges, int k, int t) {vector<vector<pair<int,int>>> g(n);for(auto& e : edges){g[e[0]].emplace_back(e[1], e[2]);}int ans = -1;set<tuple<int,int,int>> st; // 記憶化遍歷過的狀態auto dfs = [&](this auto&& dfs, int x, int d, int s)->void{if(d == k){ans = max(ans, s);return;}if(st.count({x, d, s}))return;st.emplace(x, d, s);for(auto& [y, w] : g[x]){if(s + w < t){dfs(y, d + 1, w + s);}}};for(int i = 0; i < n; i++){dfs(i, 0, 0);}return ans;}
};
# Python
class Solution:def maxWeight(self, n: int, edges: List[List[int]], k: int, t: int) -> int:g = [[] for _ in range(n)]for x, y, w in edges:g[x].append((y, w))ans = -1@cachedef dfs(x:int, d:int, s:int):if d == k:nonlocal ansans = max(ans, s)returnfor y, w in g[x]:if w + s < t:dfs(y, d + 1, w + s)for i in range(n):dfs(i, 0, 0)return ans

四、子樹反轉和

在這里插入圖片描述

本題的反轉操作有距離限制,也就是說對當前結點進行反轉操作之后,與它距離小于 k 的結點就不能進行反轉操作了,所以我們在 dfs 遍結點的時候,需要增加兩個參數 mul : 表示當前的結點取正還是取負cd : 多少距離后,就能再次進行反轉操作,故我們有 dfs(x,fa,mul,cd)

  • x 結點不反轉時, d f s ( x , f a , m u l , c d ) = s u m ( d f s ( y , x , m u l , ( c d ? c d ? 1 , 0 ) ) ) + ( m u l ? n u m s [ x ] : ? n u m s [ x ] ) dfs(x,fa,mul,cd)=sum(dfs(y,x,mul,(cd\ ?\ cd-1,0)))+(mul\ ?\ nums[x]\ : \ -nums[x]) dfs(x,fa,mul,cd)=sum(dfs(y,x,mul,(cd???cd?1,0)))+(mul???nums[x]?:??nums[x]),其中 y 是結點 x 的所有子節點
  • x 結點反轉且 cd == 0 時, d f s ( x , f a , m u l , c d ) = s u m ( d f s ( y , x , ! m u l , k ? 1 ) ) + ( m u l ? ? n u m s [ x ] : n u m s [ x ] ) dfs(x,fa,mul,cd)=sum(dfs(y,x,!mul,k-1))+(mul\ ?\ -nums[x]\ : \ nums[x]) dfs(x,fa,mul,cd)=sum(dfs(y,x,!mul,k?1))+(mul????nums[x]?:?nums[x]),其中 y 是結點 x 的所有子節點

代碼如下

// C++
class Solution {
public:long long subtreeInversionSum(vector<vector<int>>& edges, vector<int>& nums, int k) {int n = nums.size();vector<vector<int>> g(n);for(auto & e : edges){g[e[0]].push_back(e[1]);g[e[1]].push_back(e[0]);}vector memo(n, vector(2, vector<long long>(k, -1)));auto dfs = [&](this auto&& dfs, int x, int fa, bool mul, int cd)->long long{ // f0, cd0, f1if(memo[x][mul][cd] != -1) return memo[x][mul][cd];long long res = mul ? nums[x] : -nums[x];for(int y : g[x]){if(y != fa){res += dfs(y, x, mul, (cd ? cd - 1 : 0));}}if(cd == 0){long long res2 = mul ? -nums[x] : nums[x];for(int y : g[x]){if(y != fa){res2 += dfs(y, x, !mul, k - 1);}}res = max(res, res2);}return memo[x][mul][cd] = res;};return dfs(0, -1, true, 0);}
};
# Python
class Solution:def subtreeInversionSum(self, edges: List[List[int]], nums: List[int], k: int) -> int:n = len(nums)g = [[] for _ in range(n)]for x,y in edges:g[x].append(y)g[y].append(x)memo = {}def dfs(x:int, fa:int, mul:bool, cd:int)->int:t = (x, mul, cd)if t in memo:return memo[t]res = nums[x] if mul else -nums[x]for y in g[x]:if y != fa:res += dfs(y, x, mul, cd - 1 if cd > 0 else 0)if cd == 0:res2 = -nums[x] if mul else nums[x]for y in g[x]:if y != fa:res2 += dfs(y, x, not mul, k - 1)res = max(res, res2)memo[t] = resreturn resreturn dfs(0, -1, True, 0)

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

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

相關文章

告別 pip:使用 uv 加速你的 Python 包管理

使用 uv:更快的 Python 包管理工具 隨著 Python 生態的演進,包管理工具也在不斷升級迭代。uv 是 Astral(同樣維護 ruff 的團隊)推出的下一代 Python 包與項目管理器,主打 單一可執行文件、極致性能,可在多數場景下取代 pip、pip-tools、pipx 與 virtualenv 等傳統工具,…

MATLAB學習筆記(七):MATLAB建模城市的雨季防洪排污的問題

使用 MATLAB 對城市雨季防洪排污問題進行建模與仿真&#xff0c;需要結合數學模型、工程經驗和 MATLAB 的數值計算、數據可視化及優化工具。以下是詳細的步驟指南&#xff0c;包含實際案例和代碼示例&#xff1a; 一、問題分析與建模框架 1. 問題拆解 ? 核心目標&#xff1a; …

以項目的方式學QT開發C++(二)——超詳細講解(120000多字詳細講解,涵蓋qt大量知識)逐步更新!

API 描述 函數原型 參數說明 push_back() 在 list 尾部 添加一個元素 void push_back(const T& value); value &#xff1a;要添 加到尾部的元 素 這個示例演示了如何創建 std::list 容器&#xff0c;并對其進行插入、刪除和迭代操作。在實際應用中&am…

08 web 自動化之 PO 設計模式詳解

文章目錄 一、什么是 POM二、如何基于 POM 進行自動化框架架構&#xff1f;1、base 層封裝2、pageobjects 層封裝3、TestCases 層封裝 三、元素和方法分離&數據分離1、哪些部分可以進行分離2、示例代碼 四、總結 一、什么是 POM POM page object model 頁面對象模型 WEB 自…

將 JSON 批量轉換為 XML:深度解析與完整實現指南

在數據科學與機器學習項目中&#xff0c;數據預處理始終扮演著不可或缺的角色。尤其當你面對多類別圖像標注任務&#xff0c;而標注數據卻是以 JSON 形式存在&#xff0c;而目標檢測模型卻偏好 VOC 格式的 XML 時&#xff0c;這個轉換過程就變得極為關鍵。 本文將帶你深入解讀…

AlphaEvolve:基于Gemini的算法發現與優化綜合報告

引言 ? 本報告分析Google DeepMind于2025年5月14日正式發布的AlphaEvolve技術。? AlphaEvolve是一種由Gemini大型語言模型驅動的進化式編碼代理&#xff0c;專注于通用算法的發現和優化。? 報告深入探討AlphaEvolve的技術原理、實際應用及其對未來AI和算法研究的潛在影響。…

排序算法之高效排序:快速排序,歸并排序,堆排序詳解

排序算法之高效排序&#xff1a;快速排序、歸并排序、堆排序詳解 前言一、快速排序&#xff08;Quick Sort&#xff09;1.1 算法原理1.2 代碼實現&#xff08;Python&#xff09;1.3 性能分析 二、歸并排序&#xff08;Merge Sort&#xff09;2.1 算法原理2.2 代碼實現&#xf…

Android開發——輪播圖引入

Android開發——輪播圖引入 一、前期準備與依賴引入二、配置啟動類(AndroidManifest.xml)三、構造啟動類(MainActivity.java)四、配置布局文件(activity_main.xml)五、最終效果與擴展方向一、前期準備與依賴引入 在開始引入輪播圖功能前,需確保已正確搭建Android開發環境…

[逆向工程]C++實現DLL卸載(二十六)

[逆向工程]C實現DLL卸載&#xff08;二十六&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09;是Windows系統下實現進程間通信、功能擴展、監控調試的核心技術之一。本文將從原理分析、代碼實現、實戰調試到防御方案&#xff0c;全方位講解如何用C實現DLL注入&…

lesson01-PyTorch初見(理論+代碼實戰)

一、初識PyTorch 二、同類框架 PyTorchVSTensorFlow 三、參數 對比 四、PyTorch生態 四、常用的網絡層 五、代碼分析 import torch from torch import autogradx torch.tensor(1.) a torch.tensor(1., requires_gradTrue) b torch.tensor(2., requires_gradTrue) c tor…

STM32中的DMA

DMA介紹 什么是DMA? DMA&#xff08;Direct Memory Access&#xff0c;直接存儲器訪問&#xff09;提供在外設與內存、存儲器和存儲器之間的高速數據傳輸使用。它允許不同速度的硬件裝置來溝通&#xff0c;而不需要依賴于CPU&#xff0c;在這個時間中&#xff0c;CPU對于內存…

聊聊JetCache的緩存構建

序 本文主要研究一下JetCache的緩存構建 invokeWithCached com/alicp/jetcache/anno/method/CacheHandler.java private static Object invokeWithCached(CacheInvokeContext context)throws Throwable {CacheInvokeConfig cic context.getCacheInvokeConfig();CachedAnnoC…

c#隊列及其操作

可以用數組、鏈表實現隊列&#xff0c;大致與棧相似&#xff0c;簡要介紹下隊列實現吧。值得注意的是循環隊列判空判滿操作&#xff0c;在用鏈表實現時需要額外思考下出入隊列條件。 設計頭文件 #ifndef ARRAY_QUEUE_H #define ARRAY_QUEUE_H#include <stdbool.h> #incl…

開源項目實戰學習之YOLO11:12.3 ultralytics-models-sam-encoders.py源碼分析

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 另外,前些天發現了一個巨牛的AI人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。感興趣的可以點擊相關跳轉鏈接。 點擊跳轉到網站。 ultralytics-models-sam 1.sam-modules-encoders.pyblocks.py: 定義模型中的各…

STM32 | FreeRTOS 消息隊列

01 一、概述 隊列又稱消息隊列&#xff0c;是一種常用于任務間通信的數據結構&#xff0c;隊列可以在任務與任務間、中斷和任務間傳遞信息&#xff0c;實現了任務接收來自其他任務或中斷的不固定長度的消息&#xff0c;任務能夠從隊列里面讀取消息&#xff0c;當隊列中的消…

Java 安全漏洞掃描工具:如何快速發現和修復潛在問題?

Java 安全漏洞掃描工具&#xff1a;如何快速發現和修復潛在問題&#xff1f; 在當今的軟件開發領域&#xff0c;Java 作為一種廣泛使用的編程語言&#xff0c;其應用的規模和復雜度不斷攀升。然而&#xff0c;隨著應用的拓展&#xff0c;Java 應用面臨的潛在安全漏洞風險也日益…

Python繪制克利夫蘭點圖:從入門到實戰

Python繪制克利夫蘭點圖&#xff1a;從入門到實戰 引言 克利夫蘭點圖&#xff08;Cleveland Dot Plot&#xff09;是一種強大的數據可視化工具&#xff0c;由統計學家William Cleveland在1984年提出。這種圖表特別適合展示多個類別的數值比較&#xff0c;比傳統的條形圖更直觀…

LVGL- Calendar 日歷控件

1 日歷控件 1.1 日歷背景 lv_calendar 是 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;提供的標準 GUI 控件之一&#xff0c;用于顯示日歷視圖。它支持用戶查看某年某月的完整日歷&#xff0c;還可以實現點擊日期、標記日期、導航月份等操作。這個控件…

多指標組合策略

該策略(MultiConditionStrategy)是一種基于多種技術指標和市場條件的交易策略。它通過綜合考慮多個條件來生成交易信號,從而決定買入或賣出的時機。 以下是對該策略的詳細分析: 交易邏輯思路 1. 條件1:星期幾和價格變化判斷 - 該條件根據當前日期是星期幾以及價格的變化…

BC 范式與 4NF

接下來我們詳細解釋 BC 范式&#xff08;Boyce-Codd范式&#xff0c;簡稱 BCNF&#xff09;&#xff0c;并通過具體例子說明其定義和應用。 一、BC范式的定義 BC范式&#xff08;Boyce-Codd范式&#xff0c;BCNF&#xff09;是數據庫規范化理論中的一種范式&#xff0c;它比第…