1 題目:最大化數組末位元素的最少操作次數
官方標定難度:中
給你兩個下標從 0 開始的整數數組 nums1 和 nums2 ,這兩個數組的長度都是 n 。
你可以執行一系列 操作(可能不執行)。
在每次操作中,你可以選擇一個在范圍 [0, n - 1] 內的下標 i ,并交換 nums1[i] 和 nums2[i] 的值。
你的任務是找到滿足以下條件所需的 最小 操作次數:
nums1[n - 1] 等于 nums1 中所有元素的 最大值 ,即 nums1[n - 1] = max(nums1[0], nums1[1], …, nums1[n - 1]) 。
nums2[n - 1] 等于 nums2 中所有元素的 最大值 ,即 nums2[n - 1] = max(nums2[0], nums2[1], …, nums2[n - 1]) 。
以整數形式,表示并返回滿足上述 全部 條件所需的 最小 操作次數,如果無法同時滿足兩個條件,則返回 -1 。
示例 1:
輸入:nums1 = [1,2,7],nums2 = [4,5,3]
輸出:1
解釋:在這個示例中,可以選擇下標 i = 2 執行一次操作。
交換 nums1[2] 和 nums2[2] 的值,nums1 變為 [1,2,3] ,nums2 變為 [4,5,7] 。
同時滿足兩個條件。
可以證明,需要執行的最小操作次數為 1 。
因此,答案是 1 。
示例 2:
輸入:nums1 = [2,3,4,5,9],nums2 = [8,8,4,4,4]
輸出:2
解釋:在這個示例中,可以執行以下操作:
首先,選擇下標 i = 4 執行操作。
交換 nums1[4] 和 nums2[4] 的值,nums1 變為 [2,3,4,5,4] ,nums2 變為 [8,8,4,4,9] 。
然后,選擇下標 i = 3 執行操作。
交換 nums1[3] 和 nums2[3] 的值,nums1 變為 [2,3,4,4,4] ,nums2 變為 [8,8,4,5,9] 。
同時滿足兩個條件。
可以證明,需要執行的最小操作次數為 2 。
因此,答案是 2 。
示例 3:
輸入:nums1 = [1,5,4],nums2 = [2,5,3]
輸出:-1
解釋:在這個示例中,無法同時滿足兩個條件。
因此,答案是 -1 。
提示:
1 <= n == nums1.length == nums2.length <= 1000
1 < = n u m s 1 [ i ] < = 1 0 9 1 <= nums1[i] <= 10^9 1<=nums1[i]<=109
1 < = n u m s 2 [ i ] < = 1 0 9 1 <= nums2[i] <= 10^9 1<=nums2[i]<=109
2 solution
1 設 nums1, nums2 最后一個數分別是 x 和 y,則它們必須滿足是全局最大值和最小值的最大值2 不妨設 x = min(x, y) 則可以統計各數組中有幾個數比 x 大
代碼
class Solution {/** 1 設 nums1, nums2最后一個數分別是 n1 和 n2,則它們必須滿足是全局最大值和最小值的最大值* 2 不妨設 x = min(n1, n2) 則可以統計各數組中有幾個數比 x 大*/
public:int minOperations(vector<int> &nums1, vector<int> &nums2) {int x = nums1.back();int y = nums2.back();if (x > y) swap(x, y);int a = 0, b = 0;for (int i = 0; i < nums1.size() - 1; i++) {if (nums1[i] > y || nums2[i] > y) return -1;if (nums1[i] > x && nums2[i] > x) return -1;if (nums1[i] > x) a++;else if (nums2[i] > x) b++;}if (x == y) return min(a, b);if (x == nums1.back()) return min(a, b + 1);return min(a + 1, b);}
};