這篇“c++中摩爾投票法如何使用”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“c++中摩爾投票法如何使用”文章吧。
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)耿馬,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
算法:
典型的摩爾投票法使用場(chǎng)景
摩爾投票法分為兩個(gè)階段:抵消階段和計(jì)數(shù)階段。
1. 抵消階段:兩個(gè)不同投票進(jìn)行對(duì)坑,并且同時(shí)抵消掉各一張票,如果兩個(gè)投票相同,則累加可抵消的次數(shù);2. 計(jì)數(shù)階段:在抵消階段最后得到的抵消計(jì)數(shù)只要不為0,那這個(gè)候選人是有可能超過一半的票數(shù)的, 為了驗(yàn)證,則需要遍歷一次,統(tǒng)計(jì)票數(shù),才可確定。 備注:對(duì)于1/3,1/4.....1/n,做法就是設(shè)置n-1個(gè)投票候選人,采用摩爾投票的方法進(jìn)行操作。
題目1: 超過半數(shù)的多數(shù)元素
代碼實(shí)現(xiàn):
func majorityElement(nums []int) int { tmp,count := 0,0 for _,num:=range nums { if count == 0 { tmp = num } if num == tmp { count++ } else { count-- } } return tmp}// 算法:數(shù)組里面有一個(gè)數(shù)超過一半數(shù)量,// 那么可以用這個(gè)數(shù)作為標(biāo)示,這個(gè)數(shù)就+1,不是這個(gè)數(shù)就-1,最后剩余的數(shù)就是所求
題目2: 求眾數(shù)
代碼實(shí)現(xiàn):
func majorityElement(nums []int) []int {
// 創(chuàng)建返回值
var res = make([]int, 0)
if nums == nil || len(nums) == 0 {
return res
}
// 初始化兩個(gè)候選人 candidate,以及他們的計(jì)數(shù)票
cand1 := nums[0]
count1 := 0
cand2 := nums[0]
count2 := 0
//摩爾投票法
// 配對(duì)階段
for _, num := range nums {
// 投票
if cand1 == num {
count1++
continue
}
if cand2 == num {
count2++
continue
}
if count1 == 0 {
cand1 = num
count1++
continue
}
if count2 == 0 {
cand2 = num
count2++
continue
}
count1--
count2--
}
// 計(jì)數(shù)階段
count1 = 0
count2 = 0
for _, num := range nums {
if cand1 == num {
count1++
} else if cand2 == num {
count2++
}
}
if count1 > len(nums)/3 {
res = append(res, cand1)
}
if count2 > len(nums)/3 {
res = append(res, cand2)
}
return res
}
// 算法:摩爾投票法的應(yīng)用
// 因?yàn)槭?/3,所以采用2個(gè)候選人來進(jìn)行抉擇。
以上就是關(guān)于“c++中摩爾投票法如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。