|
| 1 | +package main |
| 2 | + |
| 3 | +import "testing" |
| 4 | + |
| 5 | +/** |
| 6 | +<p>我们有两个长度相等且不为空的整型数组 <code>nums1</code> 和 <code>nums2</code> 。在一次操作中,我们可以交换 <code>nums1[i]</code> 和 <code>nums2[i]</code>的元素。</p> |
| 7 | +
|
| 8 | +<ul> |
| 9 | + <li>例如,如果 <code>nums1 = [1,2,3,<u>8</u>]</code> , <code>nums2 =[5,6,7,<u>4</u>]</code> ,你可以交换 <code>i = 3</code> 处的元素,得到 <code>nums1 =[1,2,3,4]</code> 和 <code>nums2 =[5,6,7,8]</code> 。</li> |
| 10 | +</ul> |
| 11 | +
|
| 12 | +<p>返回 <em>使 <code>nums1</code> 和 <code>nums2</code> <strong>严格递增 </strong>所需操作的最小次数</em> 。</p> |
| 13 | +
|
| 14 | +<p>数组 <code>arr</code> <strong>严格递增</strong> 且 <code>arr[0] < arr[1] < arr[2] < ... < arr[arr.length - 1]</code> 。</p> |
| 15 | +
|
| 16 | +<p><b>注意:</b></p> |
| 17 | +
|
| 18 | +<ul> |
| 19 | + <li>用例保证可以实现操作。</li> |
| 20 | +</ul> |
| 21 | +
|
| 22 | +<p> </p> |
| 23 | +
|
| 24 | +<p><strong>示例 1:</strong></p> |
| 25 | +
|
| 26 | +<pre> |
| 27 | +<strong>输入:</strong> nums1 = [1,3,5,4], nums2 = [1,2,3,7] |
| 28 | +<strong>输出:</strong> 1 |
| 29 | +<strong>解释: </strong> |
| 30 | +交换 A[3] 和 B[3] 后,两个数组如下: |
| 31 | +A = [1, 3, 5, 7] , B = [1, 2, 3, 4] |
| 32 | +两个数组均为严格递增的。</pre> |
| 33 | +
|
| 34 | +<p><strong>示例 2:</strong></p> |
| 35 | +
|
| 36 | +<pre> |
| 37 | +<strong>输入:</strong> nums1 = [0,3,5,8,9], nums2 = [2,1,4,6,9] |
| 38 | +<strong>输出:</strong> 1 |
| 39 | +</pre> |
| 40 | +
|
| 41 | +<p> </p> |
| 42 | +
|
| 43 | +<p><strong>提示:</strong></p> |
| 44 | +
|
| 45 | +<ul> |
| 46 | + <li><code>2 <= nums1.length <= 10<sup>5</sup></code></li> |
| 47 | + <li><code>nums2.length == nums1.length</code></li> |
| 48 | + <li><code>0 <= nums1[i], nums2[i] <= 2 * 10<sup>5</sup></code></li> |
| 49 | +</ul> |
| 50 | +
|
| 51 | +<div><details><summary>Related Topics</summary><div><li>数组</li><li>动态规划</li></div></details></div> |
| 52 | +<div><li>👍 371</li><li>👎 0</li></div> |
| 53 | +*/ |
| 54 | + |
| 55 | +func TestMinSwap(t *testing.T) { |
| 56 | + t.Log(minSwap([]int{1, 3, 5, 4}, []int{1, 2, 3, 7})) |
| 57 | + t.Log(minSwap([]int{0, 3, 5, 8, 9}, []int{2, 1, 4, 6, 9})) |
| 58 | +} |
| 59 | + |
| 60 | +//leetcode submit region begin(Prohibit modification and deletion) |
| 61 | +func minSwap(nums1 []int, nums2 []int) int { |
| 62 | + dp := make([][2]int, len(nums1)) |
| 63 | + dp[0][0] = 0 |
| 64 | + dp[0][1] = 1 |
| 65 | + for i := 1; i < len(nums1); i++ { |
| 66 | + a1 := nums1[i-1] |
| 67 | + a2 := nums1[i] |
| 68 | + b1 := nums2[i-1] |
| 69 | + b2 := nums2[i] |
| 70 | + |
| 71 | + if (a1 < a2 && b1 < b2) && (a1 < b2 && b1 < a2) { |
| 72 | + dp[i][0] = min(dp[i-1][0], dp[i-1][1]) |
| 73 | + dp[i][1] = min(dp[i-1][0], dp[i-1][1]) + 1 |
| 74 | + } else if a1 < a2 && b1 < b2 { |
| 75 | + dp[i][0] = dp[i-1][0] |
| 76 | + dp[i][1] = dp[i-1][1] + 1 |
| 77 | + } else { |
| 78 | + dp[i][0] = dp[i-1][1] |
| 79 | + dp[i][1] = dp[i-1][0] + 1 |
| 80 | + } |
| 81 | + } |
| 82 | + return min(dp[len(nums1)-1][0], dp[len(nums1)-1][1]) |
| 83 | +} |
| 84 | +func min(a, b int) int { |
| 85 | + if a > b { |
| 86 | + return b |
| 87 | + } |
| 88 | + return a |
| 89 | +} |
| 90 | + |
| 91 | +//leetcode submit region end(Prohibit modification and deletion) |
0 commit comments