C++刷題 - 7.27

貪心算法的詳細邏輯

這個問題的最優解可以用?貪心算法?在?O(N) 時間?內解決。它的核心思想是:

每次操作盡可能覆蓋最長的連續非零區間,并通過數學分析發現:最小操作次數等于所有“上升臺階”的高度差之和


1. 直觀理解

假設?steps = [1, 2, 3, 2, 1],我們可以這樣操作:

  1. 第一次操作:覆蓋整個數組?[1,2,3,2,1]?→?[0,1,2,1,0]
    (操作次數 +=1)

  2. 第二次操作:覆蓋?[1,2,1]?→?[0,0,1,0,0]
    (操作次數 +=1)

  3. 第三次操作:覆蓋?[1]?→?[0,0,0,0,0]
    (操作次數 +=1)

總操作次數 = 3,正好等于?1 (初始) + (2-1) + (3-2) = 3


2. 貪心策略的數學證明

  • 關鍵觀察

    • 如果當前數字?steps[i]?比前一個數字?steps[i-1]?大,說明需要?新增?steps[i] - steps[i-1]?次操作

    • 如果?steps[i] <= steps[i-1],說明它可以被之前的操作覆蓋,無需新增操作次數。

  • 數學表達

    text

    總操作次數 = steps[0] + Σ max(steps[i] - steps[i-1], 0)  (i = 1 to N-1)

3. 代碼實現

cpp

#include <vector>
#include <iostream>
using namespace std;int GetMinStep(const vector<int>& steps) {if (steps.empty()) return 0;int res = steps[0]; // 初始必須有 steps[0] 次操作for (int i = 1; i < steps.size(); i++) {if (steps[i] > steps[i-1]) {res += steps[i] - steps[i-1]; // 增加新的操作}}return res;
}int main() {vector<int> steps1 = {1, 2, 3, 2, 1};cout << GetMinStep(steps1) << endl; // 輸出 3vector<int> steps2 = {3, 2, 1, 2, 3};cout << GetMinStep(steps2) << endl; // 輸出 5vector<int> steps3 = {4, 1, 2, 3, 1};cout << GetMinStep(steps3) << endl; // 輸出 6 (4 + 0 + 1 + 1 + 0)return 0;
}

4. 為什么貪心算法是正確的?

反證法

假設貪心算法不是最優的,那么存在某個?steps[i]?沒有被正確覆蓋:

  • 情況 1steps[i] > steps[i-1]
    如果少操作,會導致?steps[i]?無法歸零,矛盾。

  • 情況 2steps[i] <= steps[i-1]
    它已經被之前的操作覆蓋,無需額外操作。

因此,貪心策略的正確性得證。


5. 對比原始模擬方法

方法時間復雜度適用場景
原始模擬(每次找最長區間減1)O(N2)直觀但較慢
貪心算法(數學優化)O(N)最優解

6. 實際應用示例

示例 1steps = [3, 2, 1, 2, 3]
  • 計算過程

    • res = 3(初始)

    • i=1:?2 <= 3?→ 不增加

    • i=2:?1 <= 2?→ 不增加

    • i=3:?2 > 1?→?res += 1?→?res=4

    • i=4:?3 > 2?→?res += 1?→?res=5

  • 總操作次數 = 5

示例 2steps = [4, 1, 2, 3, 1]
  • 計算過程

    • res = 4(初始)

    • i=1:?1 <= 4?→ 不增加

    • i=2:?2 > 1?→?res += 1?→?res=5

    • i=3:?3 > 2?→?res += 1?→?res=6

    • i=4:?1 <= 3?→ 不增加

  • 總操作次數 = 6


7. 總結

  • 貪心策略:利用高度差直接計算最小操作次數。

  • 優勢:O(N) 時間,無需模擬每次操作。

  • 適用場景:題目允許數學分析時,優先使用貪心算法。

這種方法高效且優雅,能完美解決問題! 🎯


資源?

#include <iostream>
#include <vector>
#include <climits>
#include <queue>
#include <list>
#include <unordered_set>
using namespace std;
void PrintList(list<pair<int,int>> lists)
{for(auto l:lists){cout<<"<"<<l.first<<" "<<l.second<<">"<<"   ";}cout<<endl;
}int Solution(const int frameNum, const int windowSize, const vector<int> pages) 
{int ret = 0;// 記錄訪問次數,訪問時間,// <51 1> <52 1> <53 1>// <52 1> <53 1> <54 1>// 要么遍歷一遍時間,要么遍歷一遍page,要么加空間// 鏈表比較合適,list<pair<int,int>> pagesList;for(auto& page:pages){auto it = pagesList.begin();bool flagFind = false;while(it!=pagesList.end()){if(it->first == page){flagFind = true;it->second++;break;}it++;}if(flagFind == false){if(pagesList.size()<frameNum){pagesList.push_back(make_pair(page,1));}else // 觸發置換{//從頭節點開始取windowSize個//遍歷得到最小值auto left = pagesList.begin();int nums = windowSize;int minof = INT_MAX;while (nums>0){minof = min(minof,left->second);left++;nums--;}nums = windowSize;left = pagesList.begin();while (nums>0){if(left->second==minof){pagesList.erase(left);pagesList.push_back(make_pair(page,1));break;}left++;nums--;}ret++;}}//PrintList(pagesList);//cout<<ret<<endl;}return ret;
}

單詞統計

int Solution(const vector<string> lines) 
{// 需要特殊處理的 " " . ,    -string allLines;int ret = 0;for(int l=0;l<lines.size();l++){int i =0;if(lines[l] == "-"){  }    else{  while (i<lines[l].size()){while(i<lines[l].size()&&(lines[l][i]==','||lines[l][i]=='.'||lines[l][i]==' ')){i++;}if(i<lines[l].size()){ret++;while((i<lines[l].size())&&(lines[l][i]<='z'&&lines[l][i]>='a')){i++;} }if((i==lines[l].size()-1 )&& lines[l][i]=='-') {i++;if(l+1<lines.size()&&lines[l+1][0]>='a'&&lines[l+1][0]<='z')   { ret--;}if(l+1<lines.size()&&lines[l+1]=="-"){ret--;}}}}}return ret;
}

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

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

相關文章

音頻3A處理簡介之AGC(自動增益控制)

在音頻通話和視頻會議中&#xff0c;音頻自動增益控制AGC模塊的主要作用&#xff1a;? 穩定音頻信號的輸出電平。無論麥克風采集信號的強弱&#xff08;如用戶離麥克風遠近程度不同&#xff09;&#xff0c;盡可能保證音頻采集模塊的輸出音量保持相對一致&#xff0c;不會偏大…

web前端打包apk包

我用的是HBuilder工具,可視化更便捷&#xff0c;目前我這操作的apk包是不需要上架的&#xff0c;所以跟實際需要上架的可能還有些出入 首先先新建個項目&#xff0c;選擇5App模式 把目前需要打包的內容上傳到服務器&#xff0c;我們以嵌套的形式進行打包&#xff0c;找到index.…

Ansible提權sudo后執行報錯

1.問題 配置了sudo提權信息后&#xff0c;執行ansible-play報錯&#xff0c;報錯信息如下&#xff1a;2.原因 sudo沒有執行**/bin/sh的權限&#xff0c;而ansible腳本中依賴/bin/sh**&#xff0c;所以報錯了&#xff1a; 查看日志sudo tail -f /var/log/secure3.解決方式 修改*…

.NET報表控件ActiveReports發布v19.0——正式兼容 .NET 9

ActiveReports 是一款專注于 .NET 和 .NET Core 平臺的報表控件。通過拖拽式報表設計器&#xff0c;可以快速地設計 Excel表格、Word文檔、圖表、數據過濾、數據鉆取、精準套打等類型報表&#xff0c;全面滿足 WinForm、ASP.NET、ASP.NET MVC、WPF 平臺中各種報表的開發需要。同…

SCI論文選詞煉句

標準句子不能啰嗦&#xff1b;詞不能有問題&#xff0c;得是SCI中經常出現的&#xff0c;符合上下文的。SCI論文中常出現的摸棱兩可的詞單詞涵義例子Architecture指 整體系統設計方案&#xff0c;如網絡層次結構、模塊組合、激活函數選擇等深度學習模型架構Structure更泛泛&…

Qt deleteLater 延遲刪除原理

deleteLater 調用 事件發送 void QObject::deleteLater() {QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); }首先該對象繼承QObject調用deleteLater&#xff0c; 內部會發送刪除事件QCoreApplication::postEvent(this, new QDeferredDeleteEvent()) 到事件循…

TypeScript SDK 升級:通過 Upload Relay 賦能更多應用

自 3 月主網上線以來&#xff0c;Walrus 開發者社區持續展現出強勁的發展勢頭&#xff1a; 當前 Walrus 已存儲超 758 TB 數據&#xff0c;為數百個項目提供支持。在 2025 年 6 月舉辦的 Sui Overflow 黑客松上&#xff0c;Walrus 成為最受歡迎的數據層。該賽事共收到 599 個項…

C#線程同步(二)鎖

目錄 1.lock 2.Monitor 3.鎖的其它要注意的問題 3.1同步對象的選擇 3.2什么時候該上鎖 3.3鎖和原子性 3.4嵌套鎖 3.5 死鎖 3.6 性能 4.Mutex 5.Semaphore 1.lock 讓我們先看一段代碼&#xff1a; class ThreadUnsafe {static int _val1 1, _val2 1;static void G…

鴻蒙智能居家養老系統構思(續二)—— 適老化烹飪中心詳細構思

一、背景在“寫給華為鴻蒙智家 —— 智能居家養老系統構思”一文中&#xff0c;結合對居家養老的理解及個人體驗&#xff0c;提出了基于鴻蒙OS實現居家養老系統的粗略構思。其中包含“吃得好”。當老人到了不能隨性外出活動、只能在家消耗時光時&#xff0c;除了一些看看電視、…

高斯透鏡公式(調整鏡頭與感光元件之間的距離時,使得不同距離的物體在感光元件上形成清晰的影像)

當使用定焦鏡頭時&#xff0c;仍然可以調整鏡頭與感光元件&#xff08;或膠片&#xff09;之間的距離時&#xff0c;使得不同距離的物體在感光元件上形成清晰的影像。對此可以用高斯透鏡公式進行解釋&#xff1a; 一、透鏡成像的基本原理 在光學中&#xff0c;一個基本的公式是…

預過濾環境光貼圖制作教程:第三階段 - GGX 分布預過濾

核心目標 GGX 分布是 PBR 中模擬粗糙表面高光反射的主流模型,其核心是通過統計分布描述微表面的朝向概率。本階段的目標是: 基于第一階段生成的環境圖集,預計算 6 個級別的 GGX 過濾結果(對應不同粗糙度); 使用蒙特卡洛采樣(Monte Carlo Sampling)加速 GGX 卷積計算;…

Spring框架與AutoCAD結合應用

什么是AutoCAD? AutoCAD簡介 AutoCAD是由美國Autodesk公司開發的計算機輔助設計(CAD)軟件,廣泛應用于建筑、工程、制造、產品設計等領域。它支持2D繪圖和3D建模,提供精確的圖形工具和自動化功能,幫助用戶高效創建技術圖紙和模型。 主要功能 2D繪圖:提供直線、圓弧、多…

Java 學習筆記:常用類、String 與日期時間處理

作為一名名 Java 初學者&#xff0c;最近在學習過程中整理了一些關于常用類、String 類以及日期時間處理的知識點。這些內容是 Java 基礎中的重點&#xff0c;也是日常編程練習中頻繁用到的工具&#xff0c;掌握它們能讓我們在寫代碼時更加得心應手。今天把這些筆記分享出來&am…

Android常用的adb和logcat命令

ADB ADB&#xff0c;即 Android Debug Bridge 是一種允許模擬器或已連接的 Android 設備進行通信的命令行工具&#xff0c;它可為各種設備操作提供便利&#xff0c;如安裝和調試應用&#xff0c;并提供對 Unix shell&#xff08;可用來在模擬器或連接的設備上運行各種命令&…

重學JS-001 --- JavaScript算法與數據結構(一)JavaScript 基礎知識

文章目錄 變量 變量命名規則 變量命名 let vs const 變量使用范圍 賦值 = 控制臺輸出 運算符 ++ -- == === !== 注釋 轉義字符 數據類型 7種 原始數據類型 1. string?? 2. number?? 3. ??boolean?? 4. null?? 5. undefined?? 6. ??symbol??(ES6 新增) 7. big…

MySQL數據閃回工具my2sql的使用

場景&#xff1a; 當你或者其它人員誤操作數據庫不小心刪除或者更新了一批數據&#xff0c;但是是當時又沒事先備份時&#xff0c;你可以 用這個 my2sql工具快速幫你找回數據。就是如此的絲滑。但是要注意的是只限于dml語句&#xff0c;所以我們在操作數據庫前必需先備份哦&…

9.1無法恢復的錯誤與 panic!

無法恢復的錯誤與 panic! 有時你的代碼中會發生嚴重問題&#xff0c;而你無能為力。在這些情況下&#xff0c;Rust 提供了 panic! 宏。實際上&#xff0c;有兩種方式會導致 panic&#xff1a;一種是執行某個操作使代碼產生 panic&#xff08;例如訪問數組越界&#xff09;&…

分享低功耗單火線開關語音識別方案

在眾多老舊建筑和常規家居環境里&#xff0c;單火線布線是主流方式。單火線語音識別芯片方案通過研發和應用特殊的單火線語音識別芯片&#xff0c;實現設備在單火線供電條件下穩定運行&#xff0c;并精準識別語音指令&#xff0c;為智能家居、智能照明等領域帶來便捷的語音控制…

如何在Windows操作系統上通過conda 安裝 MDAnalysis

MDAnalysis 是一個開源的 Python 庫,旨在提供一個高效且靈活的方式來分析和處理分子動力學(MD)模擬數據。它可以從不同的文件格式中讀取模擬軌跡和結構數據,進行復雜的數據處理和分析,廣泛應用于生物物理學、化學、材料科學等領域。 一、創建虛擬環境 為了能夠順利安裝,減…

實用PDF演示解決方案

它打破了傳統閱 讀模式&#xff0c;讓PDF文檔也能像PPT一樣流暢播放&#xff0c;特別適合匯報、講解等展示場景。它是綠色單文件版&#xff0c;無需安裝&#xff0c;雙擊紅色圖標即點即用。運行后第一件事&#xff0c;建議把界面語言切換成中文&#xff0c;操作更順手。導入PDF…