leetcode 670 最大交换

这篇博客介绍了LeetCode第670题的最大交换问题的解决方案,包括直接遍历法和贪心法。两种方法的时间复杂度均为O(lognum),空间复杂度为O(lognum)。直接遍历法通过遍历数组,找到右侧最大值进行交换;贪心法则从右向左寻找,找到满足条件的最小索引进行交换,从而达到最大化目的。
摘要由CSDN通过智能技术生成

670. 最大交换 - 力扣(LeetCode)

 

1.直接遍历法

理解:对于num[i],要找到右侧idx最大,且num[idx]最大的数,如果num[idx]>[num[i],则交换

时间复杂度:O((log num)^2)

空间复杂度:O(log num)

class Solution:
    def maximumSwap(self, num: int) -> int:
        numArr=[n for n in str(num)]
        for i in range(len(numArr)):
            tmpMax=-1
            idx=-1
            for j in range(i,len(numArr)):
                if i==j:
                    co"""  """ntinue
                if int(numArr[j])>=tmpMax:
                    tmpMax=int(numArr[j])
                    idx=j
            if idx!=-1 and tmpMax>int(numArr[i]):
                numArr[idx],numArr[i]=numArr[i],numArr[idx]
                res=''.join(numArr)
                return int(res)
        return num
        

2.贪心法

贪心法,要交换的idx1,idx2, idx1<idx2,则idx2应该尽可能大,idx1尽可能小,同时满足,s[idx1]<s[idx2], s[idx2]是idx1右边最大且索引最大的元素

时间复杂度:O(log num)

空间复杂度:O(log num)

class Solution:
    def maximumSwap(self, num: int) -> int:
        s=list(str(num))
        n=len(s)
        maxId=n-1
        idx1,idx2=-1,-1
        for i in range(n-1,-1,-1):
            if s[i]>s[maxId]:
                maxId=i
            elif s[i]<s[maxId]:
                idx1,idx2=i,maxId
        if idx1<0:
            return num
        s[idx1],s[idx2]=s[idx2],s[idx1]
        return int(''.join(s))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值