洛谷P2397摩爾投票法的優(yōu)化
第一次提交的思路和代碼是的你沒有想錯我是直接拿著上一篇解決2013年408的解法直接去提交洛谷P2397 yyy loves Maths VI (mode) / 摩爾投票這道題的。結(jié)果也是不孚眾望沒有打錯字啊就是這個孚很絕望啊只是過了一部分的點因為考慮到了這個數(shù)據(jù)的范圍但是沒有考慮這個數(shù)組空間的大小?;仡櫼幌滤悸返谝槐楸闅v找候選人第二遍遍歷驗證候選人是否真的出現(xiàn)超過 n/2 次數(shù)組作為參數(shù)傳入需要知道長度時間O(N),數(shù)組也為ON感覺沒啥大問題于是我很自然地寫出了下面這段代碼就提交去了#includebits/stdc.h using namespace std; int vote(int num[], int n) { int cand num[0]; int hp 1; // 第一遍找候選人 for(int i 1; i n; i) { if(hp 0) { cand num[i]; hp 1; } else if(cand num[i]) hp; else hp--; } // 第二遍驗證是否確實超過 n/2 if(hp 0) return -1; hp 0; for(int i 0; i n; i) { if(num[i] cand) hp; } return hp n / 2 ? cand : -1; } int main() { int n; cin n; int num[n]; // 變長數(shù)組存全部數(shù)據(jù) for(int i 0; i n; i) cin num[i]; int flag vote(num, n); cout flag; }結(jié)果就是這個很顯然易見爆內(nèi)存了因為除了題目信息意外既然忘記看了這個題目后面的時間限制1.00s 和 內(nèi)存限制 5.00MB了我使用這個數(shù)組產(chǎn)生的空間大小為 2,000,000 × 4B 8,000,000 B是8MB。所以我第二次的優(yōu)化方向為讓這個數(shù)組變小一點或者最好不使用數(shù)組這樣花費的空間變小不就可以通過了嗎。第二次提交的思路優(yōu)化和代碼優(yōu)化更深層的反思我犯了一個根本性的錯誤摩爾投票法根本不需要存整個數(shù)組摩爾投票的核心思想是來一個抵消一個遇到相同的數(shù) → 票數(shù) 1遇到不同的數(shù) → 票數(shù) -1同歸于盡票數(shù)為0 → 換候選人這完全是流式處理只需要記住當前候選人和當前票數(shù)兩個變量即可。因為在408中出現(xiàn)了這個數(shù)組在這個題目當中有這個輸入一行整數(shù)所以下意識的想到使用數(shù)組也就是把它寫成了先存再算白白浪費了 O(n) 的空間我們完全可以把這個過程抽象成為打擂臺“排好隊一個一個來來一個處理一個這樣等到遍歷完數(shù)組整個過程也是結(jié)束了。代碼如下#includebits/stdc.h using namespace std; int main() { int n,cand0; cinn; int hp0; for(int i0;in;i) { int x; cinx; if(hp0) { candx; hp; } else if(candx) hp; else hp--; } if(hp0) cand-1; coutcand; }另外要說明的是為什么這里不需要第二遍驗證重新讀一遍題目一共有 n 個正整數(shù)ai 他讓 redbag 找眾數(shù)。他還特意表示這個眾數(shù)出現(xiàn)次數(shù)超過了一半。 他的意思是N個正整數(shù)里面必然存在如果不存在這個主元素在這個題目當中一定會說明這個主元素不存在要怎么辦比如輸出-1表示這種很顯然就是不存在這個特殊的情況。這種流式處理思維是這次提交得到的最大的收獲代碼還能這樣去優(yōu)化空間以前考慮的都是在時間層面上的這個思路望我以后一定要記得住。

相關(guān)新聞

死鎖檢測與解除:從原理到工程實踐的系統(tǒng)性解決方案

死鎖檢測與解除:從原理到工程實踐的系統(tǒng)性解決方案

1. 項目概述:從“卡死”到“疏通”的系統(tǒng)工程 在后臺系統(tǒng)開發(fā)或者數(shù)據(jù)庫運維的日常里,最讓人頭疼的瞬間之一,莫過于系統(tǒng)突然“卡住”不動了。前端的請求轉(zhuǎn)著圈圈,后端的日志停滯不前,CPU和內(nèi)存占用看起來卻不高。這時候…

2026/8/1 15:21:43 閱讀更多
videoJS播放m3u8視頻流:從原理到實戰(zhàn)的完整解決方案

videoJS播放m3u8視頻流:從原理到實戰(zhàn)的完整解決方案

1. 項目緣起:當videoJS遇上m3u8,一個看似簡單卻暗藏玄機的任務(wù) 最近在做一個內(nèi)部培訓(xùn)系統(tǒng)的后臺,需要嵌入一些技術(shù)分享視頻。視頻團隊給過來的源文件,清一色都是 .m3u8 格式的。對于前端來說,這不算什么新鮮事&#…

2026/8/1 15:11:43 閱讀更多
從TOP30榜單看眼科藥品零售趨勢:一份基于規(guī)模及增速雙高數(shù)據(jù)的市場結(jié)構(gòu)分析

從TOP30榜單看眼科藥品零售趨勢:一份基于規(guī)模及增速雙高數(shù)據(jù)的市場結(jié)構(gòu)分析

由中康開思發(fā)布的2026Q1全國零售藥店眼科類藥品規(guī)模&增速雙高TOP30榜單顯示,玻璃酸鈉滴眼液以5億銷售額穩(wěn)居一季度規(guī)模首位,作為干眼癥一線用藥的市場地位持續(xù)鞏固;左氧氟沙星滴眼液銷售額突破1億元,同比增長31%,展…

2026/8/1 15:11:43 閱讀更多
CMake與Visual Studio的使用

CMake與Visual Studio的使用

前言:對于一些cmake編譯的項目,對于Windows環(huán)境下,我一般先安裝一個cmake gui(官網(wǎng)有)。開發(fā)環(huán)境:cmake gui:cmake 3.22VS:2019第一步設(shè)置源碼目錄:選擇你的項目根目錄&a…

2026/8/1 16:21:45 閱讀更多
數(shù)字孿生行業(yè)動態(tài):飛渡科技、51視界、漂視網(wǎng)絡(luò)引領(lǐng)新賽道

數(shù)字孿生行業(yè)動態(tài):飛渡科技、51視界、漂視網(wǎng)絡(luò)引領(lǐng)新賽道

數(shù)字孿生行業(yè)動態(tài):飛渡科技、51視界、漂視網(wǎng)絡(luò)引領(lǐng)新賽道 引言 數(shù)字孿生技術(shù)作為工業(yè)4.0和智慧城市建設(shè)的核心引擎,正迎來前所未有的發(fā)展機遇。本文聚焦國內(nèi)數(shù)字孿生領(lǐng)域的領(lǐng)軍企業(yè)——飛渡科技、51視界、漂視網(wǎng)絡(luò)的最新動態(tài),剖析行業(yè)發(fā)展風(fēng)向…

2026/8/1 16:21:45 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設(shè)備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/1 0:09:33 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設(shè)備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/1 0:09:33 閱讀更多