日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

举一反三:多数元素

發(fā)布時(shí)間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 举一反三:多数元素 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:

給定一個大小為 n 的數(shù)組,找到其中的多數(shù)元素。多數(shù)元素是指在數(shù)組中出現(xiàn)次數(shù)大于 ? n/2 ? 的元素。
你可以假設(shè)數(shù)組是非空的,并且給定的數(shù)組總是存在多數(shù)元素。

示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2

解法1:哈希表

//哈希表 class Solution { public:int majorityElement(vector<int>& nums) {//哈希表unordered_map<int, int> counts;//存儲眾數(shù)int majority = 0;//存儲counts中value最大的int cnt = 0;//一邊遍歷一邊找眾數(shù)for (int num: nums) {++counts[num];if (counts[num] > cnt) {majority = num;cnt = counts[num];}}return majority;} };

?哈希表方法:一邊遍歷,一邊計(jì)數(shù),一邊找眾數(shù),并不是先技術(shù)完,再去遍歷一次找最大值。

解法2:排序

//排序 class Solution { public:int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];} };

?排序后的數(shù)組直接可以通過下標(biāo)來判斷眾數(shù)

解法3:分治

//分治 class Solution {//尋找數(shù)組中target的個數(shù)int count_in_range(vector<int>& nums, int target, int lo, int hi) {int count = 0;for (int i = lo; i <= hi; ++i)if (nums[i] == target)++count;return count;}//遞歸int majority_element_rec(vector<int>& nums, int lo, int hi) {if (lo == hi)return nums[lo];int mid = (lo + hi) / 2;//左邊的眾數(shù)int left_majority = majority_element_rec(nums, lo, mid);//右邊的眾數(shù)int right_majority = majority_element_rec(nums, mid + 1, hi);if (count_in_range(nums, left_majority, lo, hi) > (hi - lo + 1) / 2)return left_majority;if (count_in_range(nums, right_majority, lo, hi) > (hi - lo + 1) / 2)return right_majority;return -1;}public:int majorityElement(vector<int>& nums) {return majority_element_rec(nums, 0, nums.size() - 1);} };

先將數(shù)組劃分,然后分別找到左邊的眾數(shù)和右邊的眾數(shù),然后根據(jù)找到的眾數(shù)和數(shù)組長度的1/2進(jìn)行比較

解法4:Boyer- Moore算法

class Solution { public:int majorityElement(vector<int>& nums) {int candidate = -1;int count = 0;for (int num : nums) {if (num == candidate)++count;else if (--count < 0) {candidate = num;count = 1;}}return candidate;} };

我們遍歷數(shù)組 nums 中的所有元素,對于每個元素 x,在判斷 x 之前,如果 count 的值為 0,我們先將 x 的值賦予 candidate,隨后我們判斷 x:
如果 x 與 candidate 相等,那么計(jì)數(shù)器 count 的值增加 1;
如果 x 與 candidate 不等,那么計(jì)數(shù)器 count 的值減少 1。
在遍歷完成后,candidate 即為整個數(shù)組的眾數(shù)

?

?

參考地址:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/

總結(jié)

以上是生活随笔為你收集整理的举一反三:多数元素的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。