JAVA 프로그램 설계: 배열을 엄격하게 증가(LeetCode:1187)
매 단계 "조작"에서, 너는 각각arr1과arr2에서 각각 색인을 선택할 수 있다. 각각 i와 j, 0 <=i
예 1:
입력:arr1=[1,5,3,6,7],arr2=[1,3,2,4] 출력:1 해석:2로 5를 바꾸고,그 다음에arr1=[1,2,3,6,7].예 2:
입력:arr1=[1,5,3,6,7],arr2=[4,3,1] 출력:2 해석:3으로 5를 교체한 다음에 4로 3을 교체하고arr1=[1,3,4,6,7]을 얻는다.예 3:
입력:arr1 = [1,5,3,6,7],arr2 = [1,6,3] 출력:-1 해석:arr1을 엄격하게 증가시킬 수 없습니다.
팁:
1 <= arr1.length, arr2.length <= 2000 0 <= arr1[i], arr2[i] <= 10^9
사고방식: dp[i][j]를 정의하여 전 i개수가 j회 이후의 마지막 값을 대체하는 최소값을 나타낸다.복잡도 O (n^2logm)
class Solution {
final static int inf = Integer.MAX_VALUE;
public int makeArrayIncreasing(int[] arr1, int[] arr2) {
int n = arr1.length;
int m = arr2.length;
int[][] dp = new int[n + 1][n + 1];
for (int i = 0; i <= n; i++)
Arrays.fill(dp[i], inf);
Arrays.sort(arr2);
dp[0][0] = -1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= i; j++) {
if (arr1[i - 1] > dp[i - 1][j])
dp[i][j] = arr1[i - 1];
if (j > 0) {
int p = find(arr2, dp[i - 1][j - 1]);
if (p < m) dp[i][j] = Math.min(dp[i][j], arr2[p]);
}
}
}
for (int j = 0; j <= n; j++)
if (dp[n][j] != inf)
return j;
return -1;
}
private int find(int[] arr, int val) {
int l = 0, r = arr.length;
while (l < r) {
int mid = (l + r) / 2;
if (arr[mid] > val)
r = mid;
else
l = mid + 1;
}
return r;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.