670 最大交換(中等) LeetCode

2021-10-08 07:45:46 字數 2754 閱讀 3678

先將輸入數字num轉換為從高位到低位排列的陣列arr,再對arr從大到小排序得到sort_arr,從前往後遍歷,找出arrsort_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中的數字...