leetcode 704. 二分查找
题目链接:704.二分查找
文档讲解:704.二分查找-文档讲解
视频讲解:704.二分查找-视频讲解
思路:利用双指针,两个指针分别控制区间的左右边界。
-
左闭右开:
- 有效区间为[left,right),当
left==right
,例如[1,1),是没有意义的,所以循环体的边界不能包含left==right
的条件,即while left <right
; - 同时,由于[left,right)是没有意义的,以right下标的元素是不包含在区间中的,所以此时right最右边的取值应该是(数组长度),即
right = len(nums)
; - 当
nums[middle] > target
的时候,target此时在[left,middle)区间中,此时以middle为下标的元素已经确定不满足条件了,所以right = middle
,来确保[left,right)是有意义的,因为right本来就是取不到的; - 当
nums[middle] < target
的时候,target此时在[middle,right)区间中,此时以middle为下标的元素已经确定不满足条件了,所以left = middle + 1
。
- 有效区间为[left,right),当
-
左闭右闭:
- 有效区间为[left,right],当
left==right
,例如[1,1],也是有意义的,所以循环体的边界要包含left==right
的条件,即while left <=right
; - 同时,由于[left,right]是有意义的,以right下标的元素是包含在区间中的,所以此时right最右边的取值应该是(数组长度-1),即
right = len(nums) - 1
; - 当
nums[middle] > target
的时候,target此时在[left,middle)区间中,此时以middle为下标的元素已经确定不满足条件了,所以right = middle - 1
,来确保[left,right]是有意义的; - 当
nums[middle] < target
的时候,target此时在[middle,right]区间中,此时以middle为下标的元素已经确定不满足条件了,所以left = middle + 1
。
- 有效区间为[left,right],当
左闭右开
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 左闭右开
left = 0
right = len(nums) # 注意这里的区别
while left < right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle # 注意这里的区别
else:
return middle
return -1
左闭右闭
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 左闭右闭
left = 0
right = len(nums) - 1 # 注意这里的区别
while left <= right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1 # 注意这里的区别
else:
return middle
return -1
leetcode 27.移除元素
题目链接:27.移除元素
文档讲解:27.移除元素-文档讲解
视频讲解:27.移除元素-视频讲解
思路:利用双指针,一个快指针遍历数组,一个慢指针控制保留的数组
快慢指针初始化的时候,同时指向第0号元素,fast快指针首先移动,如果nums[fast] == val
,则fast += 1
;如果不相等,则将fast指向的元素,赋值给slow指向的元素位置,即 nums[slow] = nums[fast]
,快慢指针同时移动一格,即fast += 1,slow += 1
。
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
if len(nums) == 0: return 0
fast, slow =0, 0
while fast < len(nums):
if nums[fast] == val:
fast += 1
else:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow