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))