【LeetCode】力扣刷题之路 (20240819~20240823)

题目(20240819~20240823)

面试题 17.04. 消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动

示例1

输入:[3,0,1]
输出:2

示例2

输入:[9,6,4,2,3,5,7,0,1]
输出:8

方法1:等差数列求和公式

from typing import List


class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        n = len(nums)
        total_sum = n * (n + 1) // 2
        nums_sum = sum(nums)
        res = total_sum - nums_sum
        return res


if __name__ == '__main__':
    s = Solution()
    # 面试题17.04.消失的数字 - 示例1
    nums = [3, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:2
    # 示例2
    nums = [9, 6, 4, 2, 3, 5, 7, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:8

方法2:位异或运算

from typing import List


class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        n = len(nums)
        res = n
        for i in range(n):
            res ^= i  # 相同为0否则1
            res ^= nums[i]
        return res


if __name__ == '__main__':
    s = Solution()
    # 面试题17.04.消失的数字 - 示例1
    nums = [3, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:2
    # 示例2
    nums = [9, 6, 4, 2, 3, 5, 7, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:8

方法3:哈希表

from typing import List


class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        s = set(nums)
        for i in range(len(nums) + 1):
            if i not in s:
                return i
        return -1


if __name__ == '__main__':
    s = Solution()
    # 面试题17.04.消失的数字 - 示例1
    nums = [3, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:2
    # 示例2
    nums = [9, 6, 4, 2, 3, 5, 7, 0, 1]
    res = s.missingNumber(nums)
    print(res)  # 输出:8

面试题17.10. 主要元素

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

示例 1

输入:[1,2,5,9,5,9,5,5,5]
输出:5

示例 2

输入:[3,2]
输出:-1

示例 3

输入:[2,2,1,1,1,2,2]
输出:2

知识点回顾

摩尔投票(Boyer-Moore)算法:是一种高效的算法,用于在给定的数组中找出出现次数超过一半的元素。该算法的时间复杂度为O(n),空间复杂度为O(1),是一种在线性时间和常数空间内解决问题的有效方法。
基于一个关键观察:如果数组中存在一个元素的出现次数超过了总数的一半,那么该元素的出现次数减去其他所有元素出现次数的总和,结果仍然大于0。算法通过遍历数组元素,维护一个候选元素及其出现次数,逐步淘汰不可能成为多数元素的候选者,最终确定多数元素。

代码

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        if not nums:
            return -1
        # 初始化:候选主要元素和计数器
        major = nums[0]
        count = 1
        # 遍历数组每个元素
        for i in range(1, len(nums)):
            if nums[i] == major:
                count += 1
            else:
                count -= 1
                if count == 0:
                    major = nums[i]
                    count = 1
        # 统计主要元素出现次数
        count = 0
        for num in nums:
            if num == major:
                count += 1
        # 判断是否为主要元素
        return major if count > len(nums) // 2 else -1


if __name__ == '__main__':
    s = Solution()
    # 面试题17.10.主要元素
    nums = [1, 2, 5, 9, 5, 9, 5, 5, 5]
    res = s.majorityElement(nums)
    print(res)  # 输出:5
    # 示例2
    nums = [3, 2]
    res = s.majorityElement(nums)
    print(res)  # 输出:-1
    # 示例3
    nums = [2, 2, 1, 1, 1, 2, 2]
    res = s.majorityElement(nums)
    print(res)  # 输出:2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值