3.9 一轮练习hot100(31. 下一个排列 33. 搜索旋转排序数组 )

题一:31. 下一个排列

在这里插入图片描述

链接

题目链接:
文章链接:

关键点

编程思路

Me:

文档思路

标准的 “下一个排列” 算法可以描述为:

  1. 从后向前 查找第一个 相邻升序 的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
  2. 在 [j,end) 从后向前 查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
    将 A[i] 与 A[k] 交换
  3. 可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
  4. 如果在步骤 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. 搜索旋转排序数组

在这里插入图片描述

链接

题目链接:
文章链接:官方题解更好

关键点

  1. 将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
  2. 此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
  3. 二分查找的细节都在边界的处理之上!需要细品

编程思路

Me:
  1. 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:

题三:

题四:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值