我們有兩個長度相等且不為空的整型陣列 a 和 b 。我們可以交換 a[i] 和 b[i] 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的(陣列嚴格遞增的條件僅為a[0] < a[1] < a[2] < … < a[a.length - 1])。
給定陣列 a 和 b ,請返回使得兩個陣列均保持嚴格遞增狀態的最小交換次數。假設給定的輸入總是有效的。
示例:
輸入: a = [1,3,5,4], b = [1,2,3,7]
輸出: 1
解釋:
交換 a[3] 和 b[3] 後,兩個陣列如下:
a = [1, 3, 5, 7] , b = [1, 2, 3, 4]
兩個陣列均為嚴格遞增的。
注意:
a, b 兩個陣列的長度總是相等的,且長度的範圍為 [1, 1000]。
a[i], b[i] 均為 [0, 2000]區間內的整數。
用swap陣列中的swap[i]表示第i個元素如果要交換來使得ab成為遞增序列那麼需要多少次的代價。
用keep陣列的keep[i]表示第i個元素不交換使得兩個陣列依然有序需要多少代價。
舉個例子,我們再推導轉移方程。
針對a=[1,3,5,4] b=[1,2,3,7]
swap[0]=1,keep[0]=0表示第0個元素為了使其保持有序,交換確實可以,但付出了1次的代價,不交換也可以,0次代價。
swap[1]=2,keep[1]=0,前兩個元素滿足單調遞增條件,如果非要交換來使得順序成立,那就需要前兩個資料都交換,不交換依然可以,0次。
swap[2]=3,keep[2]=0,道理同上一段的推導。
swap[3]=1,keep[3]=3,觀察ab的末尾,容易看出其實只要交換了7和4就滿足了條件,那麼swap就是1。但是如果我不想交換這個元素,那麼就需要把前三個都交換一次,就是3.
經過上述的推導,我們發現keep[i],swap[i]總是與keep[i-1],swap[i-1]存在著某種聯絡。
首先有兩種情況:
一、第i個元素是滿足增序的,也就是a[i]>a[i-1],b[i]>b[i-1]因為只要保持就可以了,所以keep[i]=keep[i-1],但是如果要交換,那就比swap[i-1]還多了個第i個元素的代價,也就是swap[i]=swap[i-1]+1.
二、a[i]>b[i-1] 而且b[i]>a[i-1]這種情況滿足了「交換使得滿足條件」這兩個條件應該同時判斷,因為誰也不知道那種情況下會有更小的代價。但是如果交換就會是keep[i-1]+1的代價(因為實際上就是翻轉了第i個再加上讓前i-1個保持的代價),同理keep[i]此時等於swap[i-1]因為不翻轉這個,但要翻轉前i個。
**如下。
class
solution
:def
minswap
(self, a: list[
int]
, b: list[
int])-
>
int:
n =len(a)
swap =[0
for _ in
range
(n)]
keep =[0
for _ in
range
(n)]
swap[0]
=1# 第一次交換
for i in
range(1
,n):
swap[i]
= keep[i]
=0x7fffffff
# 如果第i個元素是滿足增序的,也就是a[i]>a[i-1],b[i]>b[i-1]因為只要保持就可以了,所以keep[i]=keep[i-1],但是如果要交換,那就比swap[i-1]還多了個第i個元素的代價,也就是swap[i]=swap[i-1]+1.
if a[i]
>a[i-1]
and b[i]
>b[i-1]
: swap[i]
= swap[i-1]
+1keep[i]
= keep[i-1]
# a[i]>b[i-1] 而且b[i]>a[i-1]這種情況滿足了「交換使得滿足條件」
if a[i]
> b[i-1]
and b[i]
> a[i-1]
: swap[i]
=min
(swap[i]
,keep[i-1]
+1) keep[i]
=min
(keep[i]
,swap[i-1]
)return
min(keep[n-1]
,swap[n-1]
)
801 使序列遞增的最小交換次數
我們有兩個長度相等且不為空的整型陣列 nums1 和 nums2 在一次操作中,我們可以交換 nums1 i 和 nums2 i 的元素。例如,如果 nums1 1,2,3,8 nums2 5,6,7,4 你可以交換 i 3 處的元素,得到 nums1 1,2,3,4 和 nums2 5,6,7,8...
(DP)801 使序列遞增的最小交換次數
我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...
leecode 801 使序列遞增的最小交換次數
我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...