很久没刷算法题,很生疏的,虽然最后都AC了,需要继续加油.
704. 二分查找
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
总结:
思路比较简单,直接套用双指针模版即可,有两个需要注意的点:
1.需要注意循环的判断条件,是< 还是 <=。
如果数组区间为左闭右开的情况,left == right是没有意义的,则应该使用left < right,否则是左闭右闭的情况,使用left <= right
2.right = middle
还是right = middle - 1?
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
27. 移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
num = len(nums)
left, right = 0, len(nums) - 1
while left <= right:
if nums[right] == val: # 首先判断最右边位置是否是val
right -= 1
num -= 1
elif nums[left] == val:
nums[right],nums[left] = nums[left], nums[right] # 左右位置交换,让val换到右边
left+=1 # 左指针右移
else:
left+=1
return num
总结:这题没尝试暴力解,直接使用的双指针解法.看了一下题解和我的解法稍微不同.
我的解法是:左右各一个指针,如果右指针指向数据满足val则进行左移.然后当左指针指向数据满足val值时,左右指针指向数据互换.把val值换到数组的后面.然后左指针右移.
题解是进行按照数组“删除”的原理进行的.利用快慢指针,快指针发现是val值,则把后一个元素前移,覆盖当前val值的位置,然后快慢指针同步后移.