返回介绍

solution / 2900-2999 / 2934.Minimum Operations to Maximize Last Elements in Arrays / README_EN

发布于 2024-06-17 01:02:58 字数 7353 浏览 0 评论 0 收藏 0

2934. Minimum Operations to Maximize Last Elements in Arrays

中文文档

Description

You are given two 0-indexed integer arrays, nums1 and nums2, both having length n.

You are allowed to perform a series of operations (possibly none).

In an operation, you select an index i in the range [0, n - 1] and swap the values of nums1[i] and nums2[i].

Your task is to find the minimum number of operations required to satisfy the following conditions:

  • nums1[n - 1] is equal to the maximum value among all elements of nums1, i.e., nums1[n - 1] = max(nums1[0], nums1[1], ..., nums1[n - 1]).
  • nums2[n - 1] is equal to the maximum value among all elements of nums2, i.e., nums2[n - 1] = max(nums2[0], nums2[1], ..., nums2[n - 1]).

Return _an integer denoting the minimum number of operations needed to meet both conditions_, _or _-1_ if it is impossible to satisfy both conditions._

 

Example 1:

Input: nums1 = [1,2,7], nums2 = [4,5,3]
Output: 1
Explanation: In this example, an operation can be performed using index i = 2.
When nums1[2] and nums2[2] are swapped, nums1 becomes [1,2,3] and nums2 becomes [4,5,7].
Both conditions are now satisfied.
It can be shown that the minimum number of operations needed to be performed is 1.
So, the answer is 1.

Example 2:

Input: nums1 = [2,3,4,5,9], nums2 = [8,8,4,4,4]
Output: 2
Explanation: In this example, the following operations can be performed:
First operation using index i = 4.
When nums1[4] and nums2[4] are swapped, nums1 becomes [2,3,4,5,4], and nums2 becomes [8,8,4,4,9].
Another operation using index i = 3.
When nums1[3] and nums2[3] are swapped, nums1 becomes [2,3,4,4,4], and nums2 becomes [8,8,4,5,9].
Both conditions are now satisfied.
It can be shown that the minimum number of operations needed to be performed is 2.
So, the answer is 2.   

Example 3:

Input: nums1 = [1,5,4], nums2 = [2,5,3]
Output: -1
Explanation: In this example, it is not possible to satisfy both conditions. 
So, the answer is -1.

 

Constraints:

  • 1 <= n == nums1.length == nums2.length <= 1000
  • 1 <= nums1[i] <= 109
  • 1 <= nums2[i] <= 109

Solutions

Solution 1: Case Discussion + Greedy

We can discuss two cases:

  1. Do not swap the values of $nums1[n - 1]$ and $nums2[n - 1]$
  2. Swap the values of $nums1[n - 1]$ and $nums2[n - 1]$

For each case, we denote the last values of the arrays $nums1$ and $nums2$ as $x$ and $y$, respectively. Then we traverse the first $n - 1$ values of the arrays $nums1$ and $nums2$, and use a variable $cnt$ to record the number of swaps. If $nums1[i] \leq x$ and $nums2[i] \leq y$, then no swap is needed. Otherwise, if $nums1[i] \leq y$ and $nums2[i] \leq x$, then a swap is needed. If neither condition is met, return $-1$. Finally, return $cnt$.

We denote the number of swaps in the two cases as $a$ and $b$, respectively. If $a + b = -2$, then it is impossible to satisfy both conditions, so return $-1$. Otherwise, return $\min(a, b + 1)$.

The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.

class Solution:
  def minOperations(self, nums1: List[int], nums2: List[int]) -> int:
    def f(x: int, y: int) -> int:
      cnt = 0
      for a, b in zip(nums1[:-1], nums2[:-1]):
        if a <= x and b <= y:
          continue
        if not (a <= y and b <= x):
          return -1
        cnt += 1
      return cnt

    a, b = f(nums1[-1], nums2[-1]), f(nums2[-1], nums1[-1])
    return -1 if a + b == -2 else min(a, b + 1)
class Solution {
  private int n;

  public int minOperations(int[] nums1, int[] nums2) {
    n = nums1.length;
    int a = f(nums1, nums2, nums1[n - 1], nums2[n - 1]);
    int b = f(nums1, nums2, nums2[n - 1], nums1[n - 1]);
    return a + b == -2 ? -1 : Math.min(a, b + 1);
  }

  private int f(int[] nums1, int[] nums2, int x, int y) {
    int cnt = 0;
    for (int i = 0; i < n - 1; ++i) {
      if (nums1[i] <= x && nums2[i] <= y) {
        continue;
      }
      if (!(nums1[i] <= y && nums2[i] <= x)) {
        return -1;
      }
      ++cnt;
    }
    return cnt;
  }
}
class Solution {
public:
  int minOperations(vector<int>& nums1, vector<int>& nums2) {
    int n = nums1.size();
    auto f = [&](int x, int y) {
      int cnt = 0;
      for (int i = 0; i < n - 1; ++i) {
        if (nums1[i] <= x && nums2[i] <= y) {
          continue;
        }
        if (!(nums1[i] <= y && nums2[i] <= x)) {
          return -1;
        }
        ++cnt;
      }
      return cnt;
    };
    int a = f(nums1.back(), nums2.back());
    int b = f(nums2.back(), nums1.back());
    return a + b == -2 ? -1 : min(a, b + 1);
  }
};
func minOperations(nums1 []int, nums2 []int) int {
  n := len(nums1)
  f := func(x, y int) (cnt int) {
    for i, a := range nums1[:n-1] {
      b := nums2[i]
      if a <= x && b <= y {
        continue
      }
      if !(a <= y && b <= x) {
        return -1
      }
      cnt++
    }
    return
  }
  a, b := f(nums1[n-1], nums2[n-1]), f(nums2[n-1], nums1[n-1])
  if a+b == -2 {
    return -1
  }
  return min(a, b+1)
}
function minOperations(nums1: number[], nums2: number[]): number {
  const n = nums1.length;
  const f = (x: number, y: number): number => {
    let cnt = 0;
    for (let i = 0; i < n - 1; ++i) {
      if (nums1[i] <= x && nums2[i] <= y) {
        continue;
      }
      if (!(nums1[i] <= y && nums2[i] <= x)) {
        return -1;
      }
      ++cnt;
    }
    return cnt;
  };
  const a = f(nums1.at(-1), nums2.at(-1));
  const b = f(nums2.at(-1), nums1.at(-1));
  return a + b === -2 ? -1 : Math.min(a, b + 1);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文