def majorityElement(nums):
# 摩尔投票法
if len(nums) == 1:
return nums[0]
# 假设数字的第一个数是众数
n = nums[0]
# 众数的个数sum
sum = 1
for _ in nums[1:]:
# 如果众数的个数为零,说明之前已经全部抵消完了,需要重新规定众数,就将当前值做为众数
if sum == 0:
n = _
sum = 1
# 如果当前数等于众数
else:
if _ == n:
sum += 1
else:
sum -= 1
return n
class Solution {
public int majorityElement(int[] nums) {
int cnt = 0, x = 0;
for (int num : nums) {
if (cnt == 0) x = num;
if (x == num) cnt++;
else cnt--;
}
return x;
}
}
class Solution {
public int majorityElement(int[] nums) {
//方法一: 直接排序返回中间值
Arrays.sort(nums);
return nums[nums.length >> 1];
//方法二 投票 众数记为1 其他数记为-1 逐个相加
int sum = 0;
int res = 0;
for(int num : nums){
if(sum == 0){
res = num;
}
//相等就加1 不等就-1
sum += num == res ? 1 : -1;
}
return res;
}
}
class Solution {
public int majorityElement(int[] nums) {
if (nums.length <= 2){
return nums[0];
}
int n = nums.length;
int result = nums[0];
int count = 1;
for (int i = 1;i < n;i++){
if (count == 0){
result = nums[i];
count = 1;
}else {
if (result == nums[i]){
count++;
}else{
count--;
}
}
}
return result;
}
}
class Solution {
public int majorityElement(int[] nums) {
if(nums.length<2) return nums[0];
int sum = 1;
int res = nums[0];
for(int i = 1;i<nums.length;i++){
if(sum == 0){
res = nums[i];
sum = 1;
}else{
if(res == nums[i]){
sum++;
}else{
sum--;
}
}
}
return res;
}
}
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n,i=0,0
for num in nums:
if i==0: n = num
if n==num:
i+=1
if n!=num:
i-=1
return n
#时间复杂度为O(n),空间复杂度O(1)
class Solution {
public int majorityElement(int[] nums) {
if (nums.length <= 2) {
return nums[0];
}
int x = nums[0];
int sum = 1;
for (int i = 1; i < nums.length; i++) {
if (sum == 0) {
x = nums[i];
sum = 1;
} else {
if (x == nums[i]) {
sum++;
} else {
sum--;
}
}
}
return x;
}
}
//个数超过一半,排序必定在中间
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
哈希表 时间复杂度O(N)空间复杂度O(n/2)
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
int len = nums.length;
int i;
for( i= 0;i < len;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
if(map.get(nums[i])*2 > len){
break;
}
}
return nums[i];
}
}
//摩尔投票法,因为相同元素大于整个数组长度的一半,所以采用一换一的形式,最后剩余的一定是该元素
//时间复杂度O(N)空间复杂度O(1)
class Solution {
public int majorityElement(int[] nums) {
int res = 0,count = 0;
for(int i = 0;i < nums.length;i++){
if(count == 0){
res = nums[i];
count++;
}else{
count += res == nums[i] ? 1 : -1;
}
}
// 1 2 3 2 2 4 2
/**
count 1 0 1 0 1 0 1
res 1 1 3 3 2 2 2
*/
return res;
}
}
class Solution {
public int majorityElement(int[] nums) {
int x = 0;
int sum = 0;
for(int num : nums) {
if(sum == 0) {
x = num;
}
sum = sum + (num == x ? 1 : -1);
}
return x;
}
}
class Solution {
//摩尔投票法
public int majorityElement(int[] nums) {
int votes = 0, res = 0;
for(int num : nums) {
if(votes == 0) res = num;
votes += res == num ? 1 : -1;
}
return res;
}
}
共以下 26 个回答
互相消耗或者排序
摩尔投票法
时间:O(n)
空间:O(1)
时间O(n) 空间O(1)
方法一 简单粗暴 时间 O(logn) 空间 0
方法二 摩尔投票 时间O(n) 空间O(n)
时间复杂度 O(N)空间复杂度 O(1)
有个方法测试用例不通过
思路:哈希或摩尔投票法
哈希和排序就不写了,直接写投票了
时间O(n)
空间O(1)
将每个元素出现的次数存在哈希表,最后遍历哈希表找出次数大于n/2的元素
时间复杂度为O(n),空间复杂度O(1)
//投票‘& nums) {
class Solution {
public:
int majorityElement(vector
int res=nums[0],cnt=1;
for(int i=1;i<nums.size();++i){
if(nums[i]res) cnt++;
else{
cnt–;
if(cnt<0){
cnt=1;
res=nums[i];
}
}
}
return res;
};
时间复杂度 O(n)
时间:O(n),空间:O(1)
//投票法& nums) {
class Solution {
public:
int majorityElement(vector
int res=nums[0],cnt=1;
for(int i=1;i<nums.size();++i){
if(nums[i]res) cnt++;
else{
cnt–;
if(cnt<0){
cnt=1;
res=nums[i];
}
}
}
return res;
};
时间复杂度O(nlogn) 空间复杂度O(1)
哈希表 时间复杂度O(N)空间复杂度O(n/2)
摩尔投票