题一:31. 下一个排列
链接
关键点
编程思路
Me:
- 无
文档思路
标准的 “下一个排列” 算法可以描述为:
- 从后向前 查找第一个 相邻升序 的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
- 在 [j,end) 从后向前 查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
将 A[i] 与 A[k] 交换 - 可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
- 如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4
力扣实战
思路一:
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 使用 Python 切片进行翻转操作记得要使用 nums[:] = 进行切片赋值。nums[j:].sort()这个操作是非法的
for i in range(len(nums)-1,0,-1):
if nums[i]>nums[i-1]: #找到第一个相邻顺序对
j = i-1
for k in range(len(nums)-1,j,-1):
if nums[k]>nums[j]:
nums[k],nums[j]=nums[j],nums[k]
break
nums[:] = nums[:i] + nums[i:][::-1]
return #提前结束
nums.sort()
# 反思1:
题二:33. 搜索旋转排序数组
链接
关键点
- 将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
- 此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
- 二分查找的细节都在边界的处理之上!需要细品
编程思路
Me:
- wu
力扣实战
思路一:
class Solution:
def search(self, nums: List[int], target: int) -> int:
#
while not nums:
return -1
l,r =0,len(nums)-1
while l <= r:
mid = (l+r)//2
if target == nums[mid]:
return mid
if nums[mid]>=nums[0]:
if nums[0]<= target<nums[mid]:
r = mid-1
else:
l = mid+1
else:
if nums[mid]<target<=nums[len(nums)-1]:
l = mid+1
else:
r = mid-1
return -1
# 反思1: