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

104 阅读1分钟

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

image.png

[剑指 Offer 53 - II. 0~n-1中缺失的数字]

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

 

示例 1:

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

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

限制:

1 <= 数组长度 <= 10000

解题思路:

  • 遇到这样的有边界的题,还是首先要判断边界值
  • 判断 len(matrix) == 0 or len(matrix[0]) == 0 返回 False
  • 递归思路,对每一行进行搜索查询,符合条件就返回True
  • 否则就返回False
class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if len(matrix) == 0 or len(matrix[0]) == 0 :
            return False
        x = 0
        y = len(matrix[0]) - 1
        while x < len(matrix) and y >= 0:
            if target == matrix[x][y]:
                return True
            elif target < matrix[x][y]:
                y -= 1
            else:
                x += 1
        return False

执行结果:

image.png

[剑指 Offer 11. 旋转数组的最小数字]

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。  

示例 1:

输入:[3,4,5,1,2] 输出:1 示例 2:

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

解题思路:

- 看到这个题,第一时间想到了python里的排序方法 sorted(numbers)[0] 返回非常快也很简单
- 但是,明显本题考察的并非这个思路,我们还是使用二分法进行查找最小值
- 使用两个值a,b 进行赋值
- 使用while进行循环判断,取中间值tmp进行判断,左侧值是否大于numbers[b] 右侧值是否小于numbers[a] 直到a<b  返回 numbers[a] 就是我们要找的值。
class Solution:
    def minArray(self, numbers: List[int]) -> int:
        a = 0
        b = len(numbers) - 1
        while a < b:
            tmp = (a + b) // 2
            if numbers[tmp] > numbers[b]: 
                a = tmp + 1
            elif numbers[tmp] < numbers[b]: 
                b = tmp
            else: 
                b -= 1
        return numbers[a]

执行结果:

image.png