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

139 阅读1分钟

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

image.png

[剑指 Offer 03. 数组中重复的数字]

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

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

限制:

2 <= n <= 100000

解题思路:

  • 本题查找重复数字,这里使用辅助字典
  • 遍历数组,将数组中数据在字典中进行初始化,如果没有设置value值为0
  • 每次遇见+1,判断如果value值大于1 则是第一个重复的值,进行返回。
class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        tmp = {}
        for row in range(len(nums)):
            tmp.setdefault(nums[row],0)
            tmp[nums[row]]+=1
            if tmp[nums[row]] >1:
                return nums[row]
        return -1

执行结果:

image.png

[剑指 Offer 53 - I. 在排序数组中查找数字 I]

统计一个数字在排序数组中出现的次数。

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2:

输入: nums = [5,7,7,8,8,10], target = 6 输出: 0  

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

解题思路:

  • 本题考察二分法查找

  • 特殊情况处理:先判断是否存在nums 和 nums的左右两边界值是否大于或者小于target如果不包含target直接返回0

  • 二分法进行处理,对查找到的值进行相加,就是我们想要的数量。

  • 有更加简单的方法,python只需要用一行代码就可以搞定,nums.count(target),但是本题考察的并非是使用内置函数,所以我们还是消停用二分法做这个题型吧。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if  not nums:
            return 0
        min_nums = nums[0]
        max_nums = nums[-1]
        if target <min_nums or target>max_nums:
            return 0

        arr = int(len(nums) // 2) 

        tmp = nums[arr] == target  
        l_tmp = self.search(nums[:arr], target)
        r_tmp = self.search(nums[arr + 1:], target)

        return  l_tmp + tmp + r_tmp  

执行结果:

image.png