学习目标:
- 数组理论基础
- 704. 二分查找
- 27. 移除元素
学习内容:
数组理论基础
二分查找是利用查找区间的中点值与被查值作比较,要求有序表。
时间复杂度:O(logn)
因为,在查找算法中时间主要花费在关键字比较上:平均查找长度(Average Search Length, ASL)。
可以借助二叉树(判定树/比较树)描述二分查找过程:中点值作根,左右子表分别作左右子树。成功查找就是走了一条从根到被查结点的路径,失败查找就是从根到外部结点的路径。左根右中序遍历有序。
704. 二分查找 - 力扣(LeetCode)https://leetcode.cn/problems/binary-search/
明确区间的开闭状态
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右闭
ans = -1
n = len(nums)
left = 0
right = n-1
while left<=right:
mid = (right-left)//2+left
if nums[mid]==target:
ans = mid
break
elif nums[mid]>target:
right = mid-1
else:
left = mid+1
return ans
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右开
ans = -1
n = len(nums)
left = 0
right = n
while left<right:
mid = (right-left)//2+left
if nums[mid]==target:
ans = mid
break
elif nums[mid]>target:
right = mid
else:
left = mid+1
return ans
35. 搜索插入位置 - 力扣(LeetCode)https://leetcode.cn/problems/search-insert-position/
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
ans = -1
n = len(nums)
# 二分查找 左闭右闭
left = 0
right = n-1
is_find = False
while left<=right:
mid = (right-left)//2+left
if nums[mid]==target:
ans = mid
is_find = True
break
elif nums[mid]>target:
right = mid-1
else:
left = mid+1
if not is_find:
ans = left
return ans
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
# 二分查找 左闭右闭
n = len(nums)
left = 0
right = n-1
ans = [-1,-1]
while left<=right:
mid = (right-left)//2+left
if nums[mid] == target:
left = mid
right = mid
while left>=0:
if nums[left]!=target:
break
left-=1
while right<n:
if nums[right]!=target:
break
right+=1
ans = [left+1,right-1]
break
elif nums[mid]>target:
right = mid-1
else:
left = mid+1
return ans
27. 移除元素 - 力扣(LeetCode)https://leetcode.cn/problems/remove-element/
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
ans = 0
for num in nums:
if num != val:
nums[ans] = num
ans+=1
return ans