题目描述
自己解法
先将输入数字num
转换为从高位到低位排列的数组arr
,再对arr从大到小排序得到sort_arr
,从前往后遍历,找出arr
与sort_arr
不同的第一个元素的下标start
,该下标的元素就是将要与低位的大数
进行替换的元素,在从start
开始遍历求取最大数,将其与start
下标的元素交换。最后再将原数组还原为数字输出即可。时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),空间复杂度
O
(
n
)
O(n)
O(n)。
class Solution:
def maximumSwap(self, num: int) -> int:
arr = [int(s) for s in str(num)]
sort_arr = sorted(arr,reverse = True)
length = len(arr)
start = 0
ans = 0
for i in range(length):
if sort_arr[i] != arr[i]:
start = i
break
## 低位的大数
maxIndex = start
for i in range(start,length):
if arr[i] >= arr[maxIndex]:
maxIndex = i
## 交换
arr[maxIndex] = arr[start]
arr[start] = sort_arr[start]
## 还原
for i in range(length):
ans += arr[i] * 10 ** (length-1-i)
return ans
看了官方题解后受到启发,基于贪心思想写了另外一种解法。该方法是使用一个列表lastIndex
存储arr
中每一位数字最后一次出现
的下标,对arr
中的每一位数字a
从高位到低位
进行遍历,在lastIndex
中倒序
查找数值比a大,位数比a低
的第一个元素。该元素就是我们要拿去与a
交换的元素。时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
n
)
O(n)
O(n)。
class Solution:
def maximumSwap(self, num: int) -> int:
lastIndex = [None for i in range(10)]
arr = [int(s) for s in str(num)]
L = len(arr)
findDone = False
ans = 0
for i,val in enumerate(arr):
lastIndex[val] = i
for i in range(L):
if not findDone:
for j in range(9,arr[i],-1):
if lastIndex[j]:
if lastIndex[j] > i:
arr[i],arr[lastIndex[j]] = arr[lastIndex[j]],arr[i]
findDone = True
break
for i,val in enumerate(arr):
ans += val * 10 **(L-1-i)
return ans