2022跟着leedcode学数据结构--第二天

74 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

image.png

数组:

[只出现一次的数字]

题目:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

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

先实现第一想法: 遍历,然后count(),这种简单粗暴,比较简单

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 先判断是否是一位,如果是直接返回,属于特殊情况
        if len(nums) ==1:
            return nums[0]
        for row in nums:
            if nums.count(row) == 1:
                return row

执行结果:

image.png

上述方法比较简单,但是显然不符合题目要求

分析题中说明部分,具有线性时间复杂度 & 不使用额外空间

显然上面算法不符合两个条件,我们来看一种符合条件的算法

符合不使用额外空间的算法,就想到了位运算,时间复杂度又符合线性复杂度:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        total = len(nums)
        for row in range(1, total):
            nums[0] ^= nums[row]
        return nums[0]

执行结果:

image.png

题2:

[多数元素]

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:[3,2,3] 输出:3 示例 2:

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

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

解题思路:

  • 遍历数组
  • 使用字典进行存储,然后对字典中存储的数据进行比对,获取最大数据所对应的key值就是我们要找的数据

实现代码

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        res = {}
        result = nums[0]
        for row in nums:
            res.setdefault(row,0)
            if row in res.keys():
                res[row]+=1
            if res[row] >res[result]:
                result = row
        return result

执行结果:(虽然成功,但不是最优解)

image.png