使数组严格递增【LC1187】
给你两个整数数组
arr1
和arr2
,返回使arr1
严格递增所需要的最小「操作」数(可能为 0)。每一步「操作」中,你可以分别从
arr1
和arr2
中各选出一个索引,分别为i
和j
,0 <= i < arr1.length
和0 <= j < arr2.length
,然后进行赋值运算arr1[i] = arr2[j]
。如果无法让
arr1
严格递增,请返回-1
。
很难呀 需要消化(为什么有时候感觉自己很聪明 有时候感觉很笨笨)
- 思路
实现
class Solution { public int makeArrayIncreasing(int[] arr1, int[] arr2) { Arrays.sort(arr2); int m = 0; for (int x : arr2) { if (m == 0 || x != arr2[m - 1]) { arr2[m++] = x; } } final int inf = 1 << 30; int[] arr = new int[arr1.length + 2]; arr[0] = -inf; arr[arr.length - 1] = inf; System.arraycopy(arr1, 0, arr, 1, arr1.length); int[] f = new int[arr.length]; Arrays.fill(f, inf); f[0] = 0; for (int i = 1; i < arr.length; ++i) { if (arr[i - 1] < arr[i]) { f[i] = f[i - 1]; } int j = search(arr2, arr[i], m); for (int k = 1; k <= Math.min(i - 1, j); ++k) { if (arr[i - k - 1] < arr2[j - k]) { f[i] = Math.min(f[i], f[i - k - 1] + k); } } } return f[arr.length - 1] >= inf ? -1 : f[arr.length - 1]; } private int search(int[] nums, int x, int n) { int l = 0, r = n; while (l < r) { int mid = (l + r) >> 1; if (nums[mid] >= x) { r = mid; } else { l = mid + 1; } } return l; } } 作者:ylb 链接:https://leetcode.cn/problems/make-array-strictly-increasing/solutions/2236262/python3javacgotypescript-yi-ti-yi-jie-do-j5ef/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。