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