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

2021-09-26 10:15:26 字數 1486 閱讀 9104

我們有兩個長度相等且不為空的整型陣列 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]區間內的整數。

題解:好久沒寫dp,也是wa了好幾發:

dp[i][0] :代表第 i 位不進行翻轉;

dp[i][1]:代表第 i 為進行翻轉;

1、當 a[i-1] >= a[i]  ||  b[i-1] >=b[i] 時,此時要進行翻**

翻轉情況:(1)、對 i-1 位進行翻轉,那麼有 dp[i][0]=dp[i-1][1]

(2)、對 i-1 位進行翻轉,那麼有 dp[i][1]=dp[i-1][0]+1

2、當 b[i-1] >= a[i]  ||  a[i-1] >=b[i] 時,此時(不能進行翻轉),或者(第 i 位和第 i-1 位都要同時翻轉):

狀態轉化:dp[i][0]=dp[i-1][0]          //  不進行翻轉

dp[i][1]=dp[i-1][1]+1      //  都進行翻轉

3、剩下的情況是 (a[i] >= a[i-1] 且 a[i] >= b[i-1]) && (b[i] >= b[i-1] 且 b[i] >= a[i-1]),這樣就可以要麼翻轉要麼                    不翻**

狀態轉換:dp[i][0]=min(dp[i-1][0],dp[i-1][1])                  //  不翻轉

dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1              //  翻轉

class solution   

else if(b[i-1]>=a[i]||a[i-1]>=b[i])

else

}return min(dp[len-1][0],dp[len-1][1]);

}};

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

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...

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...

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

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...