- 📢前言
- 🌲原題樣例:多數元素
- 🌻C#方法:投票法
- 🌻Java 方法一:哈希表
- 🌻Java 方法二:隨機化
- 💬總結
- 🚀往期優質文章分享

📢前言
| 🚀 演算法題 🚀 |
- 🌲 每天打卡一道演算法題,既是一個學習程序,又是一個分享的程序😜
- 🌲 提示:本專欄解題 編程語言一律使用 C# 和 Java 兩種進行解題
- 🌲 要保持一個每天都在學習的狀態,讓我們一起努力成為演算法大神吧🧐!
- 🌲 今天是力扣演算法題持續打卡第45天🎈!
| 🚀 演算法題 🚀 |
🌲原題樣例:多數元素
給定一個大小為 n 的陣列,找到其中的多數元素,多數元素是指在陣列中出現次數 大于 ? n/2 ? 的元素,
你可以假設陣列是非空的,并且給定的陣列總是存在多數元素,
示例 1:
輸入:[3,2,3]
輸出:3
示例 2:
輸入:[2,2,1,1,1,2,2]
輸出:2
提示:
- 2 <= numbers.length <= 3 * 104
- -1000 <= numbers[i] <= 1000
- numbers 按 非遞減順序 排列
- -1000 <= target <= 1000
- 僅存在一個有效答案
🌻C#方法:投票法
眾數總比非眾數多 因此最終能讓票數count保持大于0的數就是眾數,
注意:每當count變回0時就更換候選人,繼續統計后續票數,
思路決議
代碼:
public class Solution {
public int MajorityElement(int[] nums) {
//投票法
int condidate = nums[0];
int count = 1;
for(int j = 1;j<nums.Length;j++)
{
if(count == 0)
{
count = 1;
condidate = nums[j];
continue;
}
if(nums[j] != condidate)
{
count--;
}
else
{
count++;
}
}
return condidate;
}
}
執行結果
通過
執行用時:108 ms,在所有 C# 提交中擊敗了76.44%的用戶
記憶體消耗:29.8 MB,在所有 C# 提交中擊敗了27.49%的用戶
🌻Java 方法一:哈希表
思路決議
我們知道出現次數最多的元素大于? 2/n? 次,所以可以用哈希表來快速統計每個元素出現的次數,
我們使用哈希映射(HashMap)來存盤每個元素以及出現的次數,對于哈希映射中的每個鍵值對,鍵表示一個元素,值表示該元素出現的次數,
我們用一個回圈遍歷陣列nums并將陣列中的每個元素加入哈希映射中,在
這之后,我們遍歷哈希映射中的所有鍵值對,回傳值最大的鍵,
我們同樣也可以在遍歷陣列 nums時候使用打擂臺的方法,維護最大的值,這樣省去了最后對哈希映射的遍歷,
代碼:
class Solution {
private Map<Integer, Integer> countNums(int[] nums) {
Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
for (int num : nums) {
if (!counts.containsKey(num)) {
counts.put(num, 1);
} else {
counts.put(num, counts.get(num) + 1);
}
}
return counts;
}
public int majorityElement(int[] nums) {
Map<Integer, Integer> counts = countNums(nums);
Map.Entry<Integer, Integer> majorityEntry = null;
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
majorityEntry = entry;
}
}
return majorityEntry.getKey();
}
}
執行結果
通過
執行用時:13 ms,在所有 Java 提交中擊敗了21.51%的用戶
記憶體消耗:38.6 MB,在所有 Java 提交中擊敗了52.15%的用戶
復雜度分析
時間復雜度:O( n )
空間復雜度:O( n )
🌻Java 方法二:隨機化

代碼:
class Solution {
private int randRange(Random rand, int min, int max) {
return rand.nextInt(max - min) + min;
}
private int countOccurences(int[] nums, int num) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == num) {
count++;
}
}
return count;
}
public int majorityElement(int[] nums) {
Random rand = new Random();
int majorityCount = nums.length / 2;
while (true) {
int candidate = nums[randRange(rand, 0, nums.length)];
if (countOccurences(nums, candidate) > majorityCount) {
return candidate;
}
}
}
}
執行結果
通過
執行用時:1 ms,在所有 Java 提交中擊敗了99.96%的用戶
記憶體消耗:44.5 MB,在所有 Java 提交中擊敗了12.18%的用戶
💬總結
- 今天是力扣演算法題打卡的第四十五天!
- 文章采用
C#和Java兩種編程語言進行解題 - 一些方法也是參考力扣大神寫的,也是邊學習邊分享,再次感謝演算法大佬們
- 那今天的演算法題分享到此結束啦,明天再見!

🚀往期優質文章分享
- ??Unity零基礎到入門 | 游戲引擎 Unity 從0到1的 系統學習 路線【全面總結-建議收藏】!
- 🧡花一天時間做一個高質量飛機大戰游戲,過萬字Unity完整教程!漂亮學妹看了直呼666!
- 💛回憶童年和小伙伴一起玩過的經典游戲【炸彈人小游戲】制作程序+決議
- 💚通宵一晚做出來的一款類似CS的第一人稱射擊游戲Demo!原來做游戲也不是很難
- 🤍爆肝整整一個周末寫一款類似 皇室戰爭 的 即時戰斗類 游戲Demo!兩萬多字游戲制作程序+決議!
- 💙一款類似“恐龍快打”的 橫版街機格斗游戲 該如何制作?| 一起來學習 順便送原始碼【碼文不易,建議收藏學習】
- 💜【超實用技巧】| 提高寫文的質量 和 速率必學技能: Typora 圖床配置 詳細說明
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304581.html
標籤:其他
上一篇:排序演算法——堆排
下一篇:第37.1節 框選-繪制框選框
