先將輸入數字num
轉換為從高位到低位排列的陣列arr
,再對arr從大到小排序得到sort_arr
,從前往後遍歷,找出arr
與sort_arr
不同的第乙個元素的下標start
,該下標的元素就是將要與低位的大數
進行替換的元素,在從start
開始遍歷求取最大數,將其與start
下標的元素交換。最後再將原陣列還原為數字輸出即可。時間複雜度o(n
logn
)o(nlogn)
o(nlog
n),空間複雜度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 =
0for 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]
## 還原
看了官方題解後受到啟發,基於貪心思想寫了另外一種解法。該方法是使用乙個列表lastindex
儲存arr
中每一位數字最後一次出現
的下標,對arr
中的每一位數字a
從高位到低位
進行遍歷,在lastindex
中倒序
查詢數值比a大,位數比a低
的第乙個元素。該元素就是我們要拿去與a
交換的元素。時間複雜度o(n
)o(n)
o(n)
,空間複雜度o(n
陣列 670 最大交換
題目 解答 1 先將數每一位拆成陣列 2,若陣列為非公升序序列,則直接返回原數即可 3,否則,就找到陣列中第一次出現公升序的位置,從該位置往後找到最後乙個最大值max val及其下標max ind 4,從陣列頭開始找第乙個比max val小的數的下標i,交換i與max ind位置的數即可 1 cla...
LeetCode 670 最大交換
class solution 將num的各個位上的值存於向量中 int len res.size int k 0 for int i len 1 i 0 i 求出位置j i 1之前 包括j 的最大值 if res i 0 i 重新算出最大值 return n 思路 倒著推,因為將num值的各個位的值...
LeetCode 670 最大交換
題目 給定乙個非負整數,你至多可以交換一次數字中的任意兩位。返回你能得到的最大值 示例1 輸入 2736 輸出 7236 解釋 交換數字2和數字7。示例2 輸入 9973 輸出 9973 解釋 不需要交換。思路 先根據給定的數字,把數字的每一位拆分並放到 list 集合中,並且利用 list中的數字...