分治法 169多數元素

2021-10-09 20:41:42 字數 1318 閱讀 7473

今天是第一次做演算法題,希望這門課能學好吧。

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

示例 1:

輸入: [3,2,3]

輸出: 3

雖然這道題有很多解法,但這次我只用分治策略來解決。

首先,需要理解題意。「多數元素是指在陣列**現次數大於 ⌊n/2⌋ 的元素」

那麼事實上就是要找出陣列出現次數過半的元素。這也就說明,它只有乙個(不可能出現兩個出現次數都過半的元素吧)

繼續考慮,如果說要用分治,可以先試著對其二分,發現二分之後兩個子陣列都能得到乙個或0個過半元素。從巨集觀上看,就是由原來從大陣列得到乙個多數元素變為了從兩個子陣列中得出兩個多數元素。這樣,在combine階段,只需要對這兩個元素做判斷,看看誰在大陣列裡邊也是過半的,保留下來即可。

單獨考慮遞迴的終止條件。當乙個陣列中只有乙個元素時,遞迴就終止了,它將返回其自身的值。

//分治法求多數元素

int getmajoritynum(vector& nums,int start,int end)

//分治法,首先需要將其二分,在這裡函式會不斷呼叫自己,不會向下執行merge的

//部分,而是直到分成最小部分(終止條件)才會停止

int leftnum,rightnum;

int middle = (end+start)/2;

leftnum = getmajoritynum(nums,start,middle);

rightnum = getmajoritynum(nums,middle+1,end);

//merge的過程。想象自己處於在最底層向上返回結果之後的情況。那麼,此時,返回了乙個leftnum,乙個rightnum,正是左側陣列和右側陣列選出的多數元素。

//那麼,還需要在這兩個陣列之間做一次計數,看看這兩個元素誰依舊過半,如果過半則返回這個元素,作為這個大陣列的多數元素。

int leftcount = getcount(leftnum,nums,start,end);

int rightcount = getcount(rightnum,nums,start,end);

if (leftcount > (end+1-start)/2)

if(rightcount> (end+1-start)/2)

return -1;

}int getcount(int x,vector&nums,int start,int end)

}return count;

}

169 多數元素

解題思路 1.將陣列從小到大排序 2.第nums.length 2處的元素就是我們要求的元素,直接返回nums nums.length 2 即可 實現 class solution 解題思路 1.變數val,初始值為nums 0 記錄當前的值,計數器cnt,記錄當前元素累計出現的情況,初始值為1 2...

169 多數元素

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 分析 解法一 我們可以先排序,然後輸出在陣列 現次數大於...

169 多數元素

題目描述 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 方法1 直接使用unordered map進行...