leetcode 704
leetcode题目链接
代码随想录文章讲解
代码随想录视频讲解
二分查找
方法一:左闭右闭 [x, y]
重点
# 区间包含右边界,right等于数组长度-1
right = nums_size - 1
# left <= right是合法区间,如[1, 1],所以用小于等于
while(left <= right)
# 因是闭区间,更新之后的right和left不应该包含middle
if (nums[middle]) > target
right = middle - 1
elif (nums[middle]) < target
left = middle + 1
完整python版答案
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
方法二:左闭右开 [ x, y )
重点
# 区间不包含右边界,right等于数组长度
right = numsize
# left <= right是不合法区间,如[1, 1),所以要用小于
while(left < right)
# 因开区间搜索不到right,更新之后的right应该包含middle
if (nums[middle]) > target
right = middle
完整python版答案
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = 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
leetcode 34
只需要把这道题最后的return -1
改为return right
即可
leetcode 27
leetcode题目链接
代码随想录文章讲解
代码随想录视频讲解
移除元素
方法一:双指针法
重点
快指针:新数组需要的值
慢指针:新数组对应值的下标
整体是一个覆盖的操作,也可以理解成创建新数组
完整python版答案
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
return slow
方法二:暴力法
重点
两个for循环,一个用来遍历元素,另一个用来做覆盖操作
完整python版答案
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i, l = 0, len(nums)
while i < l:
if nums[i] == val: # 找到等于目标值的节点
for j in range(i+1, l): # 移除该元素,并将后面元素向前平移
nums[j - 1] = nums[j]
l -= 1
i -= 1
i += 1
return l