代码随想录训练营第一天|704. 二分查找|27. 移除元素
二分查找
二分查找前提:1. 有序 2. 无重复
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[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 nums[middle] > target:
right = middle - 1
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
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 nums[middle] > target:
right = middle
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
移除元素
有两种方法:
暴力法
- 时间复杂度:O(n^2)
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
快慢指针
- 时间复杂度:O(n)
- 空间复杂度:O(1)
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

腾讯成长空间 6025人发布