169. Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
给定大小为n的数组,找到多数元素。 大多数元素是出现超过⌊n / 2⌋次的元素。
You may assume that the array is non-empty and the majority element always exist in the array.
你可以假定该数组不为空,并且多数元素始终存在于数组中。
思路1:
时间复杂度O(n),空间复杂度O(n)
1.题目要求找出数量超过一半的元素,将各个元素计数,找到数量超过一半的元素输出即可
2.将原数组排序
3.定义一个相同长度的数组tem,初始值为1,代表各个元素
4.若后面元素跟之前的元素相等,把之前元素代表的个数 累加到 后面元素对应的数量上,之前元素代表的个数清零。
5.输出数量超过一半的元素
5.例如:
nums=[2,2,1,1,1,2,2] 排序后nums=[1,1,1,2,2,2,2]
tem = [1,1,1,1,1,1,1] 累加后 tem = [0,0,3,0,0,0,4]
由于tem[6]=4 > (7/2) 所以输出nums[6]=2;
nums=[3,2,3,8,3,2,9,3,3] 排序后nums=[2,2,3,3,3,3,3,8,9]
tem = [1,1,1,1,1,1,1,1,1] 累加后 tem = [0,2,0,0,0,0,5,1,1]
由于tem[6]=5 > (9/2) 所以输出nums[6]=3;
代码如下:
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
int length = nums.size();
if(length == 1)//length==1 只有一个元素
return nums[0];
vector<int> tem(length, 1);//定义一个相同长度的数组,默认值为1,代表每个数的数量
sort(nums.begin(), nums.end());//将nums排序
/*for(int m=0; m<length; m++){
cout << nums[m];
}*/
for(int i=1; i<length; i++){
if(nums[i] == nums[i-1]){//前后元素相同
tem[i] = tem[i-1] + 1;//将该元素代表的数量加1(更新数量)
tem[i-1] = 0;//之前代表的数量清零
if(tem[i] > length/2)
return nums[i];
}
}
}
};
int main()
{
if(1)
cout << "123" << endl;
Solution a;
int A[4] = {2, 7, 7, 7};
vector<int> numbers1(A, A+4);
cout << a.majorityElement(numbers1) << endl;
return 0;
}
思路2:
看了Discuss发现的好方法。因为所求的元素占超过数组一半的长度,不管怎么减count,最后留下的major一定是所求元素。(相当于一个major抵消一个别的元素,最后剩下的还是major)
时间复杂度O(n),空间复杂度O(1)
public class Solution {
public int majorityElement(int[] num) {
int major=num[0], count = 1;
for(int i=1; i<num.length;i++){
if(count==0){
count++;
major=num[i];
}else if(major==num[i]){
count++;
}else count--;
}
return major;
}
}
int majorityElement(vector<int> &num) {
int majorityIndex = 0;
for (int count = 1, i = 1; i < num.size(); i++) {
num[majorityIndex] == num[i] ? count++ : count--;
if (count == 0) {
majorityIndex = i;
count = 1;
}
}
return num[majorityIndex];
}
int majorityElement(vector<int>& nums) {
int max;
int count = 0;
int n = nums.size();
for(int i = 0; i < n; i++) {
if (count == 0) {
max = nums[i];
count = 1;
continue;
}
if (max != nums[i]) {
count--;
} else {
count++;
}
}
return max;
}
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
int n = nums.size();
for (int i = 0; i < n; i++)
if (++counts[nums[i]] > n / 2)
return nums[i];
}
};