704.二分查找
易错点:
-
循环条件:left<right or left<=right
-
middle赋值:
eg:nums[middle]>target: right=middle or right=middle-1 -
数组区间:[left,right) or [left,right]
把握好对区间的选择才能对边界值的选择做理性的分析
不同数组区间对应的条件及边界值的选择:
- 左闭右开:
循环条件:left<right(可用特殊数组长度1进行验证)
middle赋值:right=middle
left=middle+1(right,left结合循环条件考虑) - 左闭右闭:
循环条件:left<=right
middle赋值:right=middle-1
left=middle+1
python实现:
# 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,
# 写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
# nums = [-1, 0, 3, 5, 9, 12]
# target = -1
def A(nums, target):
high = len(nums) - 1
low = 0
flag = -1
while low <= high:
mid = (low + high) // 2
if target < nums[mid]:
high = mid - 1
elif target > nums[mid]:
low = mid + 1
else:
flag = mid
break
return flag
27.移除数组元素
根据数组的存车特性,数组元素不能删除只能覆盖
- 暴力解法:遍历数组,遇到目标元素值,则将其后的元素依次前移。
- 快慢指针法:通过一个快指针和慢指针,在一个循环中完成两个循环的工作。
快指针:指向新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向待更新新数组的下标
当快指针指向的元素值与目标值不匹配时,将该值插入到新数组慢指针所指向的位置
# 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
# 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
# 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素
# nums = [1, 2, 3, 3, 3, 5]
# val = 3
# 暴力解
def A(nums, val):
size = len(nums) # 新数组长度初始值
i = 0
while i < size: # i值要和新数组长度做比较
# 当前元素和目标元素相等则将当前元素之后的所有元素向前移动,并从该元素开始再次向后检查
if nums[i] == val:
temp = i
for j in range(i + 1, size):
nums[temp] = nums[j]
temp += 1
size -= 1 # 每移动一次数组元素,新数组长度减一
else:
i += 1
# print(nums[:size])
# print(size)
return size
# 快慢指针法
def B(nums, val):
size = 0 # 新数组长度
slow = 0 # 待更新的新数组下标值
for quick in range(len(nums)):
# 如果快指针指向的当前元素值与目标值不匹配则将该值插入到新数组中
if nums[quick] != val:
nums[slow] = nums[quick]
slow += 1
size += 1
# print(size)
# print(nums)
return size
相关题目:
26.删除排序数组中的重复项
283.移动零
844.比较含退格的字符串
977.有序数组的平方