刷题笔录
作者:关注了🐴
Github:Github
掘金:进去看看🐴
爱好:Americano More Ice !
QQ学习交流群(new): 811792998
剑指Offer - 在排序数组中查找数字 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
解题
二分法+递归(关键思想:理解target
和target-1
的递归调用)
- 时间复杂度 O(log N): 二分法为对数级别复杂度。
- 空间复杂度 O(1) : 几个变量使用常数大小的额外空间
class Solution:
def search(self, nums: List[int], target: int) -> int:
def search(tar):
i, j = 0, len(nums) - 1
while i <= j:
m = (i + j) // 2 # 取中间值,二分法
if nums[m] <= tar: i = m + 1 # 若中间值小于等于target值
else: j = m - 1
return i
return search(target) - search(target-1) # 递归结束
剑指Offer - 0~n-1中缺失的数字 II
一个长度为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
解题2
∵ 题目已知是排序数组
,利用该性质找数
∴ 直接上 二分法
class Solution:
def missingNumber(self, nums: List[int]) -> int:
i, j = 0, len(nums) - 1 # 初始化边界值
while i <= j:
m = (i + j) // 2 # 二分法:middle值(注意是索引值i,j)
if nums[m] == m: i = m + 1 # 若相等,跳跃到右区间
else: j = m - 1
return i # i值刚好为缺少值(利用排序数组性质)
- 时间复杂度 O(log N): 二分法为对数级别复杂度。
- 空间复杂度 O(1) : 几个变量使用常数大小的额外空间