《寶可夢:大集結》開場CG和5分鐘上手視訊公開
阿新 • • 發佈:2021-06-18
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 intl_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 };