我又来面对算法题了,唉,这次跟着代码随想录刷数组题
其实从大一开始就觉得自己思考算法题的脑回路和正常人不太一样,所以开帖记录一些自己需要记住的注意事情
二分查找
- 大多数语言的除法都是向下取证
middle=(left+right)/2不会忽略中间的middle元素,不用担心middle=(right-left)/2只计算了偏移量while left <= right:的话是左闭右闭,那么right = len-1,判断是nums[middle]<target时候结束条件是`left = middle + 1while left < right:的话是左闭右开,那么right = len,判断条件是nums[middle]<target结束条件是left = middle
移除元素
从这一章开始学习双指针:快指针和慢指针一起控制元素移动。要求原地移除等于val的元素
- 元素移动不需要再开一个循环
- python的for循环i会自动回到初始赋值,所以用while避免数组长度改变导致的数组越界的情况。暴力也要写while
- 快指针来遍历数组,慢指针来搜集不等于val的位置
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
删除有序数组中的重复项
- 思路:因为是有序数组,所以移除重复项 = 把不相同的元素移到左边
- 先判等,如果快慢指针位置对应的元素不相等,快指针元素放到慢指针+1位上,然后慢指针后移一位,然后快指针后移。如果快慢指针位置对应元素相等,直接快指针后移
- 慢指针从0开始,所以返回慢指针位置+1才是数组长度
移动零
- 快慢指针都从0开始
比较含退格的字符串
- 继续用快慢指针解体,栈虽然好理解,但下次一定
- python不能直接处理字符串,因为字符串是常量,一定要list一下
s=list(s) - 思路:快指针扫整个数组,遇到不是#就记录一下,慢指针记录真正的做完退格的字符串,每次遇到#,slow就会退一位,相当于删掉了
- 操作字符串,返回[0:slow],不包含slow的位置
class Solution(object):
def backspaceCompare(self, s, t):
def processe(s):
# if len(s) <= 1:
# return s 这个边界条件不能加
slow = 0
fast = 0
s = list(s)
while fast < len(s):
if s[fast]!= "#":
s[slow]=s[fast]
slow+=1
elif slow > 0: #slow退一格,如果slow=0那就不退
slow -=1
fast+=1
res = s[0:slow]
return res
s=processe(s)
t=processe(t)
if s==t:
return True
return False
- c++等语言的++符号,
nums[slow++] = nums[fast]==>nums[slow] = nums[fast] slow += 1,i++是先用后加,用的时候是原来的值,不是加一以后的值
有序数组的平方
- python!!排序!!哎我服了自己了就是分不清楚var.sort和sorted(var)。
list.sort()方法会对列表进行原地排序(即在原列表上进行排序),它不会返回新的列表,而是返回None-
`numsr = [i**2 for i in nums] numsr.sort() return numsr`
-
sorted()函数,它会返回一个新的排序后的列表-
`numsr = [i**2 for i in nums] return sorted(numsr)`
-
- 不投机取巧版:双指针,新数组。左边一个右边一个,其实平方之后数组的排序是V字型,所以新数组从最大(最右边)的开始放,放更大的那一个,放完之后新数组下标减一
- 编程注意:
new = [0] * len(nums)这样数组下标才不会越界,之前的new = [] new.append(xxx)是动态增长,不适合这个题。 - 但反正不能
new = []直接搭配new[100] = x这样使用。切记切记!!
- 编程注意:
长度最小的子数组
开始滑动窗口!明天继续!