1. 程式人生 > 遊戲 >《寶可夢:大集結》開場CG和5分鐘上手視訊公開

《寶可夢:大集結》開場CG和5分鐘上手視訊公開

https://leetcode-cn.com/problems/majority-element/

169. 多數元素

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

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

示例1:

輸入:[3,2,3]
輸出:3

示例2:

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

問題思路

1.原陣列分解為左右陣列兩部分。

2.求解左右資料的最大和,存在第三種情況,最大和存在於兩個分段之間。

3.合併子問題的解。

程式碼設計思路

1.涉及最多出現數字,因此return資料型別為int,同時也為該子問題的ans。

2.通過設計遞迴,必須使遞迴區間不斷變小,因此使得mid = (l+r)/2,劃分左右兩個子區間求解。

3.面向最小遞迴區間設計遞迴出口,最小遞迴為(l==r)遞迴出口為 return nums[l](==nums[r])。

4.如果左右返回的數字不同,則比較出現的次數。

 1 class Solution {
 2 public:
 3     int dfs(vector<int>& nums, int l, int r){
 4         // cout<<l<<" "<<r<<endl;
 5         //
1.先寫遞迴出口 6 if(l==r) 7 return nums[l]; 8 int mid = (l+r)/2; 9 //2.進入遞迴 10 int l_res = dfs(nums, l, mid); 11 int r_res = dfs(nums, mid+1, r); 12 //3.處理當前狀態 13 if(l_res==r_res) 14 return l_res; 15 else{ 16 int
l_cnt = 0; 17 int r_cnt = 0; 18 for(int i=l; i<=mid; i++){ 19 if(nums[i]==l_res) 20 l_cnt++; 21 } 22 for(int i=mid+1; i<=r; i++){ 23 if(nums[i]==r_res) 24 r_cnt++; 25 } 26 if(l_cnt>r_cnt) 27 return l_res; 28 else 29 return r_res; 30 } 31 } 32 33 int majorityElement(vector<int>& nums) { 34 int ans = dfs(nums, 0, nums.size()-1); 35 return ans; 36 } 37 };