3724. Minimum Operations to Transform Array
October 30, 2025 · View on GitHub
Description
You are given two integer arrays nums1 of length n and nums2 of length n + 1.
You want to transform nums1 into nums2 using the minimum number of operations.
You may perform the following operations any number of times, each time choosing an index i:
- Increase
nums1[i]by 1. - Decrease
nums1[i]by 1. - Append
nums1[i]to the end of the array.
Return the minimum number of operations required to transform nums1 into nums2.
Example 1:
Input: nums1 = [2,8], nums2 = [1,7,3]
Output: 4
Explanation:
| Step | i |
Operation | nums1[i] |
Updated nums1 |
|---|---|---|---|---|
| 1 | 0 | Append | - | [2, 8, 2] |
| 2 | 0 | Decrement | Decreases to 1 | [1, 8, 2] |
| 3 | 1 | Decrement | Decreases to 7 | [1, 7, 2] |
| 4 | 2 | Increment | Increases to 3 | [1, 7, 3] |
Thus, after 4 operations nums1 is transformed into nums2.
Example 2:
Input: nums1 = [1,3,6], nums2 = [2,4,5,3]
Output: 4
Explanation:
| Step | i |
Operation | nums1[i] |
Updated nums1 |
|---|---|---|---|---|
| 1 | 1 | Append | - | [1, 3, 6, 3] |
| 2 | 0 | Increment | Increases to 2 | [2, 3, 6, 3] |
| 3 | 1 | Increment | Increases to 4 | [2, 4, 6, 3] |
| 4 | 2 | Decrement | Decreases to 5 | [2, 4, 5, 3] |
Thus, after 4 operations nums1 is transformed into nums2.
Example 3:
Input: nums1 = [2], nums2 = [3,4]
Output: 3
Explanation:
| Step | i |
Operation | nums1[i] |
Updated nums1 |
|---|---|---|---|---|
| 1 | 0 | Increment | Increases to 3 | [3] |
| 2 | 0 | Append | - | [3, 3] |
| 3 | 1 | Increment | Increases to 4 | [3, 4] |
Thus, after 3 operations nums1 is transformed into nums2.
Constraints:
1 <= n == nums1.length <= 105nums2.length == n + 11 <= nums1[i], nums2[i] <= 105
Solutions
Solution 1: Greedy
We define an answer variable to record the minimum number of operations, with an initial value of $1$, representing the operation needed to append the last element to the end of the array.
Then we iterate through the first elements of the array. For each pair of corresponding elements , we calculate their difference and add it to .
During the iteration, we also need to check whether holds. If it does, it means we can directly adjust to reach . Otherwise, we need to record a minimum difference , which represents the minimum number of operations required to adjust some element to .
Finally, if no element satisfying the condition is found after the iteration, we need to add to , indicating that we need extra operations to adjust some element to .
The time complexity is , where is the length of the array. The space complexity is .
Python3
class Solution:
def minOperations(self, nums1: List[int], nums2: List[int]) -> int:
ans = 1
ok = False
d = inf
for x, y in zip(nums1, nums2):
if x < y:
x, y = y, x
ans += x - y
d = min(d, abs(x - nums2[-1]), abs(y - nums2[-1]))
ok = ok or y <= nums2[-1] <= x
if not ok:
ans += d
return ans
Java
class Solution {
public long minOperations(int[] nums1, int[] nums2) {
long ans = 1;
int n = nums1.length;
boolean ok = false;
int d = 1 << 30;
for (int i = 0; i < n; ++i) {
int x = Math.max(nums1[i], nums2[i]);
int y = Math.min(nums1[i], nums2[i]);
ans += x - y;
d = Math.min(d, Math.min(Math.abs(x - nums2[n]), Math.abs(y - nums2[n])));
ok = ok || (nums2[n] >= y && nums2[n] <= x);
}
if (!ok) {
ans += d;
}
return ans;
}
}
C++
class Solution {
public:
long long minOperations(vector<int>& nums1, vector<int>& nums2) {
long long ans = 1;
int n = nums1.size();
bool ok = false;
int d = 1 << 30;
for (int i = 0; i < n; ++i) {
int x = max(nums1[i], nums2[i]);
int y = min(nums1[i], nums2[i]);
ans += x - y;
d = min(d, min(abs(x - nums2[n]), abs(y - nums2[n])));
ok = ok || (nums2[n] >= y && nums2[n] <= x);
}
if (!ok) {
ans += d;
}
return ans;
}
};
Go
func minOperations(nums1 []int, nums2 []int) int64 {
var ans int64 = 1
n := len(nums1)
ok := false
d := 1 << 30
for i := 0; i < n; i++ {
x := max(nums1[i], nums2[i])
y := min(nums1[i], nums2[i])
ans += int64(x - y)
d = min(d, min(abs(x-nums2[n]), abs(y-nums2[n])))
if nums2[n] >= y && nums2[n] <= x {
ok = true
}
}
if !ok {
ans += int64(d)
}
return ans
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
TypeScript
function minOperations(nums1: number[], nums2: number[]): number {
let ans = 1;
const n = nums1.length;
let ok = false;
let d = 1 << 30;
for (let i = 0; i < n; ++i) {
const x = Math.max(nums1[i], nums2[i]);
const y = Math.min(nums1[i], nums2[i]);
ans += x - y;
d = Math.min(d, Math.abs(x - nums2[n]), Math.abs(y - nums2[n]));
if (nums2[n] >= y && nums2[n] <= x) {
ok = true;
}
}
if (!ok) {
ans += d;
}
return ans;
}