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
相關文章
- 分治法求眾數和重數(含檔案輸入輸出)
- 分治演算法-眾數問題演算法
- 求眾數
- 【20190326】【每天一道演算法題】求眾數(分治演算法)演算法
- 【leetcode】求眾數LeetCode
- 雜湊求眾數
- Leetcode刷題——求眾數LeetCode
- 2024.9.4 leetcode169 多數元素 (C++)LeetCodeC++
- 每日一算--求眾數
- 【LeetCode】求眾數(四種方法)LeetCode
- 演算法題:求眾數演算法
- 演算法:Majority Element(求眾數)演算法
- 【演算法】求眾數-js解法演算法JS
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題
- 水題 求眾數 (hash的練習)
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- Leetcode 169:求眾數(最詳細的解法!!!)LeetCode
- 【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法演算法
- 演算法面試題彙總_2求眾數演算法面試題
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- 求眾數、排序演算法、二分法排序演算法
- 挖坑填數+分治法:快速排序排序
- 樹分治 - 點分治
- 遞迴與分治之大整數乘法遞迴
- 分治
- Note - 樹分治(點分治、點分樹)
- 均值、中位數、眾數
- 分治法
- 點分治
- 分治合集
- CDQ分治
- 分治與遞迴-找k個臨近中位數的數遞迴
- 求完全數個數
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- 每日一道演算法題--leetcode 169--求眾數--python--兩種方法演算法LeetCodePython
- 分治—快速排序排序
- 歸併分治
- 根號分治