前言
这篇文章会给大家提供Leetcode 169.多数元素详细的代码以及解题思路来让大家更好的理解这道题目,记住我们的口号是“刷题使我快乐”。
一、题目描述与分析
题目链接: Leetcode 169.多数元素
题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 【n/2】的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目给我们提供了一个数组,并且有一个多数元素的概念。多数元素就是该元素在给定数组里面出现次数在一半以上,这样的元素被称为多数元素。并且这里告诉我们给到的数组一定是非空的,并且一定会出现多数元素。
二、题解以及代码
1、投票算法
投票算法,顾名思义就和投票的过程差不多,你可以选择给一个人投支持或者反对;有人给你投支持就有人给你投反对,投支持就给你加分,反对就给你减分,最后谁得的分数高谁就是被选中的人。
具体在这个题目中就是:如果这个数字出现就给他的次数加一反之就减一,如果count
变为0
就说明之前的数字不是多数元素,就更新flag
的值,如此遍历完数组后就可以保证flag
一定是多数元素,将flag
返回就可以。
时间复杂度:O(n)
空间复杂度:O(1)
int majorityElement(int* nums, int numsSize) {
int flag = nums[0],count = 0;
for(int i = 0;i < numsSize; i++){
if(count == 0){
flag = nums[i];
}
count += (nums[i] == flag)? 1 : -1;
}
return flag;
}
class Solution {
public int majorityElement(int[] nums) {
int count = 0,flag = nums[0];
for(int num : nums){
if(count == 0){
flag = num;
}
count += (num == flag)? 1: -1;
}
return flag;
}
}
2、排序
先给数组排序然后输出下标为 n/2
的元素,这个元素一定是多数元素,因为多数元素一定是出现次数大于数组的一半的。
int compare(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int majorityElement(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), compare);
return nums[numsSize / 2];
}
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
3、哈希表方法
利用Java里面的哈希表来存储数据:key
为值, value
为出现的次数。
然后遍历哈希表来找到大于 n/2
的 value
,此时 value
就是多数元素。
class Solution {
public int majorityElement(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
if (countMap.get(num) > nums.length / 2) {
return num;
}
}
return -1;
}
}
总结
这篇文章为大家提供了LeetCode 163.多数元素 的题目解析,一共用了三种不同的方法,分别是投票算法、哈希表、排序方法。他们的时间复杂度各有优劣,大家可以选择喜欢的方法使用。
那么今天的文章到这里就结束了,希望博主写的文章对大家有帮助,如果有什么问题的话可以在评论区提出,或者私信博主,欢迎大家提出问题来一起交流。