代码随想录训练营第一天|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