最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言算法金手指摩爾投票法手撕絕大多數(shù)問題

 更新時(shí)間:2022年02月14日 10:06:30   作者:?jiǎn)虇碳业凝堼? 
這篇文章主要為大家介紹了C語(yǔ)言算法之金手指摩爾投票法手撕絕大多數(shù)問題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助

正片開始

概念

嘛是摩爾投票法?
簡(jiǎn)單來說就是投票法,算法解決的問題是如何在任意多的候選人,選出獲得票數(shù)最多的那個(gè)。常見的算法是掃描一遍選票,也就是遍歷,對(duì)每個(gè)候選人進(jìn)行統(tǒng)計(jì)的選票進(jìn)行統(tǒng)計(jì)。

那我遍歷難道不香嗎?

在這里插入圖片描述

這里就要講一下投票法的過人之處

優(yōu)點(diǎn)

當(dāng)執(zhí)行有序情況時(shí),只要找到中位數(shù),然后檢查中位數(shù)的個(gè)數(shù)是否超過選票的一半即可。但是當(dāng)對(duì)象的數(shù)目不定時(shí),統(tǒng)計(jì)選票可能會(huì)執(zhí)行較長(zhǎng)時(shí)間,相比原來的時(shí)間復(fù)雜度 O(n) ,可能需運(yùn)行 O(n^2) 的時(shí)間。

針對(duì)無序且對(duì)象不定的情況,摩爾投票法應(yīng)運(yùn)而生。

算法核心

摩爾投票法的關(guān)鍵就是抵消和計(jì)數(shù),抵消過程類似于是在進(jìn)行投票,然后計(jì)數(shù)我們可以腦補(bǔ)一個(gè)情形:當(dāng)三人中的一人得票數(shù)遠(yuǎn)超其他兩人時(shí),我們就可以進(jìn)行等量對(duì)消,消完還有票的自然就是得票數(shù)最多的那個(gè),模擬如下:(ppt手殘勿噴)

在這里插入圖片描述

在這里插入圖片描述

實(shí)現(xiàn)

基本思路就是由一個(gè)計(jì)數(shù)器維護(hù),在進(jìn)行比較過程中,不同票消掉,相同票保留,如果消的沒有了就直接放進(jìn)去然后繼續(xù)上述過程,直到維護(hù)對(duì)象只剩一個(gè),就是我們要找的最大得票者(眾數(shù))。

基于LeetCode真題實(shí)踐,先看一個(gè)初級(jí)栗子:

169. 多數(shù)元素
給定一個(gè)大小為 n 的數(shù)組,找到其中的多數(shù)元素。多數(shù)元素是指在數(shù)組中出現(xiàn)次數(shù) 大于 ⌊ n/2 ⌋ 的元素。你可以假設(shè)數(shù)組是非空的,并且給定的數(shù)組總是存在多數(shù)元素。

示例:
輸入:[2,2,1,1,1,2,2]
輸出:2

來源:力扣(LeetCode)

我最初的思路是哈希思想,qsort 之后用最大的元素 malloc 一塊新的空間,桶排后用 count 進(jìn)行++,最后輸出 count 最大的。有點(diǎn)麻煩而且我忽視了一個(gè)最大的問題就是負(fù)數(shù)的存在,垮掉~

根據(jù)我們算法的思路,針對(duì)目標(biāo)數(shù)組 nums,首先創(chuàng)建一個(gè)變量來執(zhí)行計(jì)數(shù)器 count 再創(chuàng)建一個(gè)新數(shù)組 a 進(jìn)行比對(duì),因?yàn)槭冀K是目標(biāo)數(shù)組的內(nèi)部元素比較,我可以直接把 nums 首元素賦給 a ,比較時(shí)從第二個(gè)元素開始和 a 比較,如果相同,count ++;不同消掉,count --;沒有了就往里拿。

int majorityElement(int* nums, int numsSize){
    int count = 1;
    int a = nums[0];
    for(int i =1;i<numsSize;i++)
    {
        if(nums[i]==a)
        {
            count++;
        }
        else
        {
            count--;
        }
        if(count==0)
        {
        a = nums[i+1];
        }
    }
    return a;
}

格局抬高

現(xiàn)在整一道硬菜,直接上升級(jí)版:
229. 求眾數(shù) II
給定一個(gè)大小為 n 的整數(shù)數(shù)組,找出其中所有出現(xiàn)超過 ⌊ n/3 ⌋ 次的元素。

示例 :
輸入:[1,1,1,3,3,2,2,2]
輸出:[1,2]

還是那句話,題目越少眼淚越飽,短小精悍的題 nnd 硬磨了我一個(gè)下午,桶是肯定桶不了的,哈希又沒學(xué),不做吧心里太不舒服,這里就又有我摩爾投票法的一席之地了

注意,題目給的是超過 n/3 次的元素,這很重要,其實(shí)就是在暗示我們結(jié)果至多只會(huì)有三種情況:沒有眾數(shù)或者一個(gè)眾數(shù)或者兩個(gè)眾數(shù);但是頭疼的是咱之前的摩爾投票法好像行不通,因?yàn)檫@里對(duì)象不定,如果出現(xiàn)了兩個(gè)眾數(shù)我的 “ 票 ” 該怎么投?

將之前的格局打開,我們可以將所有數(shù)字分為兩類,> n/3 的元素 和 <= n/3 的元素,其中大于 n/3 的元素最多只有兩個(gè)。因此可以設(shè)置三個(gè)變量,進(jìn)行相對(duì)抵消,這里我們不妨再引入一個(gè)容器 b,再用一個(gè)新的計(jì)數(shù)器 count2 來進(jìn)行維護(hù),當(dāng)三個(gè)元素相同時(shí),count++,不同就抵消,為 0 就用把這個(gè)數(shù)放進(jìn)去,基本思想和上面是差不多的:

    int a = nums[0];
	int b = nums[1];
	int count1, count2 = 0;
	for (int i = 0; i < numsSize; i++)
	{
		if (a == nums[i])
		{
			count1++;
			continue;
		}
		else if (b == nums[i])
		{
			count2++;
			continue;
		}
		else
		{
			count1--;
			count2--;
		}
		if (count1 < 0)
		{
			a = nums[i];
			count2++;
			count1 = 1;
		}
		if (count2 < 0)
		{
			b = nums[i];
			count1++;
			count2 = 1;
		}
	}

還沒完,因?yàn)閿?shù)組可能存在一個(gè)眾數(shù)或者沒有眾數(shù)的情況,我們還需要再次遍歷來統(tǒng)計(jì)我們篩選的眾數(shù)的出現(xiàn)次數(shù)是否符合題目要求的大于n/3 以及排除數(shù)組為空或單項(xiàng)的情況:

    count1 = 0;
	count2 = 0;
	for (int i = 0; i < numsSize; i++)
	{
		if (a == nums[i])
		{
			count1++;
		}
	    else if (b == nums[i])
		{
			count2++;
		}
	}
		if (numsSize <= 1)
	{
		*returnSize = numsSize;
		return nums;
	}

最后直接依次放入一塊新的空間再返回即可,全部代碼如下:

int* majorityElement(int* nums, int numsSize, int* returnSize) {
	if (numsSize <= 1)
	{
		*returnSize = numsSize;
		return nums;
	}
	int a = nums[0];
	int b = nums[1];
	int count1, count2 = 0;
	for (int i = 0; i < numsSize; i++)
	{
		if (a == nums[i])
		{
			count1++;
			continue;
		}
		else if (b == nums[i])
		{
			count2++;
			continue;
		}
		else
		{
			count1--;
			count2--;
		}
		if (count1 < 0)
		{
			a = nums[i];
			count2++;
			count1 = 1;
		}
		if (count2 < 0)
		{
			b = nums[i];
			count1++;
			count2 = 1;
		}

	}
	count1 = 0;
	count2 = 0;
	for (int i = 0; i < numsSize; i++)
	{
		if (a == nums[i])
		{
			count1++;
		}
	    else if (b == nums[i])
		{
			count2++;
		}
	}
	int* c = (int*)malloc(sizeof(int) * 2);
    *returnSize = 0;
	if (count1 > numsSize / 3)
	{
		c[(*returnSize)++] = a;
	}
	if (count2 > numsSize / 3)
	{
		c[(*returnSize)++] = b;
	}
	return c;
}

家人們明白了嗎,那今天就到這里,摸了。

以上就是C語(yǔ)言算法金手指摩爾投票法手撕絕大多數(shù)問題的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言摩爾投票算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語(yǔ)言的方法

    VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語(yǔ)言的方法

    Visual Studio Code是一款免費(fèi)開源的現(xiàn)代化輕量級(jí)代碼編輯器,支持語(yǔ)法高亮、智能代碼補(bǔ)全、自定義熱鍵、括號(hào)匹配、代碼片段、代碼對(duì)比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語(yǔ)言,需要的朋友可以參考下
    2020-03-03
  • C語(yǔ)言實(shí)現(xiàn)高精度的加法

    C語(yǔ)言實(shí)現(xiàn)高精度的加法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)高精度的加法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++實(shí)現(xiàn)LeetCode(45.跳躍游戲之二)

    C++實(shí)現(xiàn)LeetCode(45.跳躍游戲之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(45.跳躍游戲之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++利用ImGUI繪制D3D外部菜單

    C++利用ImGUI繪制D3D外部菜單

    ImGUI 它是與平臺(tái)無關(guān)的C++輕量級(jí)跨平臺(tái)圖形界面庫(kù),沒有任何第三方依賴,可以將ImGUI的源碼直接加到項(xiàng)目中使用。本文將利用ImGUI繪制D3D外部菜單,需要的可以參考一下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)酒店管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • windows下用c++獲取本機(jī)ip地址的三種方法

    windows下用c++獲取本機(jī)ip地址的三種方法

    工作過程中遇到一個(gè)需求,需要獲取本機(jī)ip地址,同時(shí)獲取本機(jī)網(wǎng)絡(luò)連接情況,即網(wǎng)線是否連接,經(jīng)過多番搜索,本文給大家介紹了3種方案,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • C++ Boost Phoenix庫(kù)示例分析使用

    C++ Boost Phoenix庫(kù)示例分析使用

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • vscode工程中c_cpp_properties.json文件作用詳細(xì)說明

    vscode工程中c_cpp_properties.json文件作用詳細(xì)說明

    c_cpp_properties.json是Visual Studio Code的一個(gè)配置文件,用于定義C/C++編譯器的路徑、默認(rèn)包含路徑和預(yù)處理器定義,這篇文章主要給大家介紹了關(guān)于vscode工程中c_cpp_properties.json文件作用詳細(xì)說明的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 深入解析C++編程中基類與基類的繼承的相關(guān)知識(shí)

    深入解析C++編程中基類與基類的繼承的相關(guān)知識(shí)

    這篇文章主要介紹了C++編程中基類與基類的繼承的相關(guān)知識(shí),包括多個(gè)基類繼承與虛擬基類等重要知識(shí),需要的朋友可以參考下
    2016-01-01
  • Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn)

    Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn)

    本文主要介紹了Qt QCompleter自動(dòng)補(bǔ)全的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論

仙居县| 秦皇岛市| 江孜县| 水富县| 嘉禾县| 房山区| 治多县| 垦利县| 新兴县| 永年县| 辽阳市| 许昌市| 威信县| 昂仁县| 涟水县| 新余市| 海晏县| 澄江县| 崇明县| 马边| 新疆| 镇平县| 昌都县| 城固县| 水富县| 东莞市| 济南市| 阿拉善右旗| 台中县| 寻乌县| 芮城县| 泸水县| 罗田县| 汾西县| 蒲城县| 东兰县| 石景山区| 阿勒泰市| 鹤壁市| 越西县| 海林市|