二分查找
nums是给定数组,target是要找出的值,返回找出的值的位置
法一:[left, right] 左闭右闭区间
while的判断条件left <= right,当target小于中间值,right=middle-1
middle取值不能直接是(left+right)/2,防止left+right溢出
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = left + ((right - left) // 2)
if target < nums[middle]:
right = middle - 1
elif target > nums[middle]:
left = middle + 1
else:
return middle
return -1
法二:[left, right) 左闭右开区间
right初始值为数组长度,while的判断条件left < right,当target小于中间值,right=middle
middle取值不能直接是(left+right)/2,防止left+right溢出
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
middle = left + ((right - left) // 2)
if target < nums[middle]:
right = middle
elif target > nums[middle]:
left = middle + 1
else:
return middle
return -1
移除元素
nums是给定数组,val是要移除的元素,返回移除后新数组的长度
暴力解法:两次for遍历
发现要移除的值即后面所有的值向前移一位
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i, length = 0, len(nums)
while i <length:
if nums[i] == val:
for j in range(i+1, length):
nums[j-1] = nums[j]
i -= 1
length -= 1
i += 1
return length
双指针解法
快指针:寻找新数组的值 满指针:更新新数组下标位置
要求删除的值被后面的值覆盖,最后slow的值即为新数组的长度
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow, fast = 0, 0 #慢指针,快指针
while fast < len(nums):
if nums[fast] != val: #快指针找不符合要求的值
nums[slow] = nums[fast] #快指针的值覆盖慢指针的值,实现指定的值被移除的效果
slow += 1
fast += 1
return slow
参考文档: