给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
思路是,创建一个字典,keys代表出现的数字,对应的values代表这个数字出现的次数, 然后返回values中最大的值,因为题目就是返回一个int类型的值,所以getdic就是根据题目给的list返回一个字典,然后再根据字典的values的最大值返回keys列表的下标,最后返回这个下标对应的key
class Solution:
def getdic(self,nums) -> dict:
dic = dict()
for i in range(len(nums)):
if nums[i] not in dic.keys():
dic[nums[i]] = 1
else:
dic[nums[i]] = dic.get(nums[i])+1
return dic
def majorityElement(self, nums: List[int]) -> int:
DICT = self.getdic(nums)
val_list = list(DICT.values())
key_list=list(DICT.keys())
MAX = max(val_list)
ind=val_list.index(MAX)
return key_list[ind]
但是就是时间复杂度较高
思路:排序数组,如果有一个数字出现的频率大于n/2,则在数组nums.length / 2的位置就是这个数
复杂度分析:时间复杂度:O(nlogn),快排的时间复杂度。空间复杂度:O(logn),排序需要logn的空间复杂度
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
思路:循环数组,用哈希表存储数字和对应的个数,如果数字出现的个数大于n/2则返回这个数,其实简单来讲就是计数法
复杂度分析:时间复杂度:O(n),n为nums数组的长度。空间复杂度:O(n),哈希表需要的空间
class Solution {
public int majorityElement(int[] nums)
{
Map<Integer,Integer> obj = new HashMap<>();
for(int num : nums)
{
obj.put(num, obj.getOrDefault(num, 0) + 1);
if(obj.get(num) > nums.length / 2) return num;
}
return 0;
}
}
就像古代战争几个国家混在一起打仗,各方士兵只能一换一,不对自己人下手,战争之后剩下的人属于哪个国家,哪个国家获胜,其他国家失败。
得票数为0说明保持中立,初始化候选人为列表第一个数字
class Solution02(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return
targetnum = nums[0]
cnt = 0
for n in nums:
if targetnum == n:
cnt += 1
else:
cnt -= 1
if cnt == -1:
targetnum = n
cnt = 0
return targetnum