LeetCode169求眾數——分治
題目:
給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋
的元素。
你可以假設陣列是非空的,並且陣列中的眾數永遠存在。
方法:
- Hash Table
- 排序
- 分治法
分治法是將整個問題化簡為一個一個的小問題去解,將陣列分成簡單的幾部分,比如講一組數分為兩部分,第一部分的眾數如果等於第二部分的眾數,則這個數就是上一層那一組的眾數,如果第一部分不等於第二部分,則遍歷這一組數,記錄這兩個數的出現頻率,返回為頻率最大的,如果頻率相同,返回誰都無所謂,因為在這裡眾數x肯定存在的,那麼肯定會有至少兩個x相連,如果不相連的話,那最後一個數字肯定是眾數x。(例如:1 2 1 2 1 2 1,12112)。時間複雜度為o(n)。
我用了分治法解決的,下面是測試程式碼:
public class LC169 {
static int[] nums = {1,2,1,3,1,2,1};
public static void main(String[] args) {
int result = find(nums,0,nums.length-1);
System.out.println(result);
}
public static int find(int[] nums, int begin, int end){
if (begin == end)
return nums[begin];
else {
int mid = (begin+end)/2;
int left = find(nums,begin,mid);
int right = find(nums,mid+1,end);
if(left == right)//左右兩部分的眾數相同 則這個數是這部分的眾數
return left;
else{//左右兩部分的眾數不相同 則這兩個數都有可能是這部分的眾數
//那麼遍歷這個陣列 看一下哪個數字的出現頻率高
int countLeft = 0;
int countRight = 0;
for (int i = begin; i <= end; i++)
if(nums[i] == left)
countLeft++;
else if (nums[i] == right)
countRight++;
if(countLeft>=countRight)
return left;
else
return right;
}
}
}
}
下面是提交程式碼
class Solution {
public int majorityElement(int[] nums) {
return find(nums,0,nums.length-1);
}
public static int find(int[] nums, int begin, int end){
if (begin == end)
return nums[begin];
else {
int mid = (begin+end)/2;
int left = find(nums,begin,mid);
int right = find(nums,mid+1,end);
if(left == right)//左右兩部分的眾數相同 則這個數是這部分的眾數
return left;
else{//左右兩部分的眾數不相同 則這兩個數都有可能是這部分的眾數
//那麼遍歷這個陣列 看一下哪個數字的出現頻率高
int countLeft = 0;
int countRight = 0;
for (int i = begin; i <= end; i++)
if(nums[i] == left)
countLeft++;
else if (nums[i] == right)
countRight++;
if(countLeft>countRight)
return left;
else
return right;
}
}
}
}
Moore voting alogrithm
相關文章
- 分治法求眾數和重數(含檔案輸入輸出)
- 分治演算法-眾數問題演算法
- 演算法設計--眾數和重數問題(分治法)演算法
- 【leetcode】求眾數LeetCode
- 【20190326】【每天一道演算法題】求眾數(分治演算法)演算法
- 演算法題:求眾數演算法
- c++實現求眾數及其重數C++
- 【演算法】求眾數-js解法演算法JS
- 演算法:Majority Element(求眾數)演算法
- Leetcode刷題——求眾數LeetCode
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- 【LeetCode】求眾數(四種方法)LeetCode
- 【演算法解題報告】求眾數演算法
- 【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法演算法
- 演算法面試題彙總_2求眾數演算法面試題
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題
- 挖坑填數+分治法:快速排序排序
- 樹分治 - 點分治
- 求眾數、排序演算法、二分法排序演算法
- Leetcode 169:求眾數(最詳細的解法!!!)LeetCode
- 【分治 求最近點對】hdu 1007 Quoit Design
- POJ-2299 Ultra-QuickSort-分治法排序求交換速度UI排序
- 點分治
- CDQ分治
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- 斐波那契數列的分治法計算
- 分治—快速排序排序
- POJ1142 Smith Numbers(數論,分治+暴力,質因數分解)MIT
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- ACM 眾數問題ACM
- 眾數問題分析
- 分治FFT小記?FFT
- 分治演算法演算法
- 求正整數
- 找眾數演算法演算法
- 利用分治策略解題
- 有趣的請求引數/請求頭
- 轉發精品:求極限、求積分、求微分、求導數、求曲,求全微分、求複合求導