数组理论基础,704. 二分查找,27. 移除元素
一、数组是存放在连续内存空间上的相同类型数据的集合。
·注意:数据的下标都是从0开始,数组内存空间地址都是连续的
因此删除元素的时候其他元素会产生移动
二、二分法
注意区间,二分法区间主要两种,左闭右闭、左闭右开
左闭右闭:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
注意闭区间内,如果target<middle,此时区间不包含middle值,则右区间更新为middle-1,target>midle,区间内不包括middle,则左区间更新为middle+1
注:闭区间len(nums)-1
左闭右开:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) # 定义target在左闭右开的区间里,即:[left, right)
while left < right: # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle # target 在左区间,在[left, middle)中
elif nums[middle] < target:
left = middle + 1 # target 在右区间,在[middle + 1, right)中
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
注意左闭右开区间内,如果target<middle,此时区间不包含middle值,则右区间更新为middle,target>midle,区间内不包括middle,则左区间更新为middle+1
注:len(nums)
三、移除元素
(版本一)快慢指针法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 快慢指针
fast = 0 # 快指针
slow = 0 # 慢指针
size = len(nums)
while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界
# slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
注:将快指针中的不等于val的值给慢指针,符合条件后慢指针+1,而快指针是每次都会+1,在if循环外。即慢指针用于收集不等于val的值。最终返回slow。做的时候弄反了slow和fast
四、有序数组的平方
暴力 排序 简单
指针的思路是:数组左右两边的数是比较大的,两边向中间推