leetcode503 下一个更大元素(三)

思路:

举例:找出“1342”的下一个最大元素

步骤:

1)从倒数两位开始检查是否满足倒序排列,即“42”,“342”,“1342”,发现“342”开始不满足倒序排列。

2)找出该子排列“342”中比第一个数字“3”大的最小数字,即“4”。

3)交换该子排列“342”中的第一个数字“3”和找到的比“3”大的最小数字“4”,即子排列变为“432”。

4)对该子排列,保持第一个数字不动,剩余元素升序排列,即“423”,再把该子排列拼接回原排列的对应位置,即“1423”,得解。

注意:排序完的值要在int32的范围内。

import sys
def find(n):
    n_str=[c for c in str(n)]
    for i in range(2,len(n_str)+1):
        temp_str=n_str[len(n_str)-i:len(n_str)]
        if temp_str!=sorted(temp_str,reverse=True):#说明当前子区间之内存在下一个最大元素
            now_first=int(temp_str[0])
            min_j=sys.maxsize#min_j要大于nowfirst
            min_j_index=0
            for j in range(1,len(temp_str)):
                if int(temp_str[j])<min_j and int(temp_str[j])>now_first:
                    min_j=int(temp_str[j])
                    min_j_index=j
            temp_str[0],temp_str[min_j_index]=temp_str[min_j_index],temp_str[0]
            temp_str[1:]=sorted(temp_str[1:])#后面部分升序
            n_str[len(n_str)-i:len(n_str)]=temp_str
            return int(''.join(n_str)) if -2147483648<=int(''.join(n_str))<=2147483647 else -1
    return -1


print(find(1999999999))

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值