每日一题20201106(169. 多数元素)

简介: 多数元素

1.jpg

image.png

hash表



1. 思路很简单,先遍历数组,存储每个元素的个数
2. 遍历hash表,拿到大于 n/2的数字,直接return


class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        hash = dict()
        for n in nums:
            if n not in hash:
                hash[n] = 1
            else:
                hash[n] += 1
        for k, v in hash.items():
            if v > len(nums) / 2:
                return k
        return -1

时间复杂度: O(N)

空间复杂度: O(N)

投票算法



思路很简单,假设你是秦始皇,数组里面有很多其他国家,你们秦兵遇到自己人就+1,遇到其他人就-1,如果你超过了所有国家一半的兵力,那么最后活下来的肯定就是你的士兵。这里之所以能这么确定,是因为题目强调了一定存在多数元素!
代码思路是,开始遍历数组,如果当前的士兵数量是0,则把当前士兵设置为遍历到的元素,比如: 秦
接下来如果遇到秦,则count+1, 遇到的是赵或者其他士兵,则秦和赵士兵同归于尽。下一轮遍历,由于秦的count是0了,则将当前士兵设置为遍历到的士兵。


class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return -1
        # 当前士兵数量
        count = 0
        # 当前士兵
        current = None
        for n in nums:
            if count == 0:
                current = n
            count += 1 if n == current else -1
        return current

时间复杂度: O(N)

空间复杂度: O(1)






相关文章
|
2月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
32 0
|
7月前
|
算法
每日一题——多数元素
每日一题——多数元素
|
7月前
|
算法
六六力扣刷题数组之移除元素
六六力扣刷题数组之移除元素
49 0
LeetCode刷题Day02——数组(元素删除、移动)
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。 定义快慢指针 • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组 • 慢指针:指向更新新数组下标的位置 即快指针不断往后找合适的元素,找到后在慢指针所在位置更新该元素。
|
算法 C语言 C++
Leetcode 每日一题 2341. 数组能形成多少数对
返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。
46 0
Leecode 169. 多数元素
Leecode 169. 多数元素
43 0
|
存储 索引
【LeetCode】每日一题:移除元素
【LeetCode】每日一题:移除元素
92 0
|
测试技术
Leetcode每日一题——“移除元素”
Leetcode每日一题——“移除元素”
每日一题:Leetcode27 移除元素
每日一题:Leetcode27 移除元素