【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)
【题目描述】
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
【示例一】
输入:nums = [3,2,3] 输出:3
【示例二】
输入:nums = [2,2,1,1,1,2,2] 输出:2
【提示及数据范围】
n == nums.length
1 <= n <= 5 * 10的4次方
-10的9次方 <= nums[i] <= 10的9次方
【代码】
// 方法一:哈希表枚举暴力求解
// 使用哈希映射(HashMap)来存储每个元素以及出现的次数。
// 对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
// 用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。
// 在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。int majorityElement(vector<int>& nums) {unordered_map<int, int> counts;int majority = 0, cnt = 0;for (int num: nums) {++counts[num];if (counts[num] > cnt) {majority = num;cnt = counts[num];}}return majority;
}// 方法二:排序
// 由于这个出现最多的数大于n / 2,所以排序后一定会出现在n / 2的下标位置处
int majorityElement(vector<int>& nums) {sort(nums.begin(),nums.end());return nums[nums.size() / 2];
}// 方法三:随机数
// 由于一个给定的下标对应的数字很有可能是众数,随机挑选一个下标
// 检查它是否是众数,如果是就返回,否则继续随机挑选。
int majorityElement(vector<int>& nums) {while (true) {int candidate = nums[rand() % nums.size()];int count = 0;for (int num : nums)if (num == candidate)++count;if (count > nums.size() / 2)return candidate;}
}