还没有完善有空再来写^^
基础理论:
重点: 数组在内存中的存储方式
- 数组下标为0
- 内存空间的地址是连续的(27题)
- 二维数组为索引的形式(ex: a[0][1])
704. 二分查找
难点 区别左闭右闭
易错点 :
while - left ≤ right / left< right
左闭右闭 [left,right] - target 在left and right 闭合的区间里 ****
left ≤ right
左闭右开[left,right) left< right
middle > target
不包含右边区间 当nums[middle] > target, right = middle
35. 搜索插入位置
[1,3,5,6] target = 5 输入左闭右闭的情况 所以 left <= right
如果找不到 需要讲数字放入l 和 r 之间
while条件结束时 left = right + 1 处
l = 0
r = len(nums) -1
while l <= r:
m = (l+r)//2
if nums[m] <target:
l = m+1
elif nums[m] > target:
r = m -1
else:
return m
return r +1
# if target < nums[middle]:
return middle
else:
return middle + 1
27. 移除元素
暴力法
遍历整个数组 如果遇到val就remove这个值 最后返回 len(nums) 因为本题 nums.length 最大100 所以暴力法可行
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
a = 0
while a < len(nums):
if nums[a] == val:
nums.remove(val)
else:
a += 1
return len(nums)
Two pointer(双指针)
和以往的双指针方法稍有不同 两个指针的起始点都是0
左指针遍历整个数组 右指针停留当当时找到val的位置 如果发现左指针 ≠ val
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
l = 0
r = 0
while l < len(nums):
if nums[l] != val:
nums[r] = nums[l]
r += 1
l += 1
return r