704.二分查找
题目链接: 704.二分查找
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:简单
思路:对于有序数组,考虑二分法的思想。要注意二分查找区间的闭合状态:左闭右开时,右区间为len(list);左闭右闭时,数组右区间为len(list)-1
时间复杂度:O(log(n));空间复杂度:O(n)
下面展示 基于二分法的代码
。
// 二分法(左闭右开)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while(left < right):
middle = left + (right - left) / 2
// 不建议middle = (left + right) / 2,当left和right都比较大时,会造成溢出
if nums[middle] == target:
return middle
elif nums[middle] < target:
left = middle + 1
else:
right = middle
return -1
// 二分法(左闭右闭)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
middle = left + (right - left) / 2
if nums[middle] == target:
return middle
elif nums[middle] > target:
right = middle - 1
else:
left = middle + 1
return -1
27.移除元素
题目链接: 704.二分查找
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:简单
思路:双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。快指针负责找值,慢指针负责更新数组,从而达到原地删除数组元素的目的。
时间复杂度:O(n);空间复杂度:O(1)
代码
如下
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# # 暴力解法
# l = len(nums)
# i = 0
# while i < l:
# if nums[i] == val:
# for j in range(i + 1, l):
# nums[j - 1] = nums[j]
# i -= 1
# l -= 1
# i += 1
# return l
# 快慢指针
fastindex, slowindex = 0, 0 # 快指针找是否有val,慢指针更新新数组
while fastindex < len(nums):
if nums[fastindex] != val:
nums[slowindex] = nums[fastindex]
slowindex += 1
fastindex += 1
return slowindex