801 使序列遞增的最小交換次數

2021-09-20 08:13:05 字數 2430 閱讀 9300

我們有兩個長度相等且不為空的整型陣列 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 請返回...