1.划分字母区间

就是跳跃游戏Ⅱ,只不过把最远跳跃的距离改成了字母最后一次出现的位置
关键参数start:作用仅限于记录区间长度
last{}字典:记录每个字母出现的最后位置,最核心的参数
end:记录当前区间里的节点能走到的最远距离
class Solution:
def partitionLabels(self, s: str) -> List[int]:
last = {}
for i,c in enumerate(s):
last[c] = i
ans = []
start = end = 0
for i,c in enumerate(s):
end = max(end,last[c])
if i==end:
ans.append(end-start+1)
start = i+1
return ans
2.下一个排列
倒序遍历,找到比当前大的最小的,交换,排序后面的,返回
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
#最核心的一步,如果54321反转整个数,这也就代表着,只要能从右向左,
#找到第一个右边大于左边的数,54312,就可以改成54321 , 54213,改成54231
n = len(nums)
i=n-2
while i>=0 and nums[i]>=nums[i+1]:
i-=1
#如果13542,找到了3,并且可以证明3右边是递减,要找到大于3且最小的就是4,34交换得到,14532,再把剩下的反转
if i>=0:
j=n-1
while nums[j]<=nums[i]:
j-=1
nums[i],nums[j]=nums[j],nums[i]
left,right = i+1,n-1
while left<right:
nums[left],nums[right] = nums[right],nums[left]
left+=1
right-=1
3.颜色分类

借用一个用户:
"微尘"的理解:
来个直观的
22222222222 先全变成2
11111122222 再变成1
00011122222 再变成0
num[i] = 2在所有循环内都会执行,所以从结果看是先全变成2,然后nums[p1]=1在所有<=1的情况下都会执行,所以从结果看是2中部分替换为1
同理0就是在2的1中部分替换为0.没问题
很形象
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
p0 = p1= 0
for i,x in enumerate(nums):
nums[i]=2
if x<=1:
nums[p1]=1
p1+=1
if x==0:
nums[p0]=0
p0+=1