我从失败走向成功。

题目描述:

多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解题代码:

1
2
3
4
5
6
7
8
9
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
int len = ceil(nums.size() / 2.0);
return nums[len - 1];

}
};

image-20230930004210454

解读与收获:

这个求解思路其实和求解众数(一组数据中出现次数最多的数)但题目是找出出现次数大于n/2的数(多数元素),只能说多数元素一定是众数,而众数不一定是多数元素,但题目说假设一定会有多数元素,所以用这种方法也可以求出题解。

将一个数组排序,中位数一定是众数。

在评论区看到了一个很有意思的解法,叫摩尔投票,代码如下:

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n = 0,votes = 0;
for(int num:nums){
if(votes == 0) n = num;
votes += num == n?1:-1;
}
return n;
}
};

n为目前假设的多数元素的值,votes是“票数”,遍历数组,当数组元素等于我们假设的多数元素,那就给票数+1,如果等于则-1,因为多数元素的数量一定大于数组长度的一半,所以其他元素的票数是不可能大于多数元素的,即-1的数量会小于+1,而对于错误的假设,最终votes一定会变成0,然后会假设新的元素为多数元素。

  • 时间复杂度 O(N)O(N)*O*(*N*) : NNN 为数组 nums 长度。
  • 空间复杂度 O(1)O(1)*O*(1) : votes 变量使用常数大小的额外空间。

image-20230930010124902