Leetcode Java Minimum Number of Operations to Make Array Continuous
업데이트:
문제
코드
class Solution {
public int minOperations(int[] nums) {
Arrays.sort(nums);
int result = Integer.MAX_VALUE;
int count = 0;
int[] dp = new int[nums.length];
for (int i = 0, j = 1; i < nums.length; i++) {
while (j < nums.length && nums[j] <= nums[i] + nums.length - 1) {
if (nums[j - 1] == nums[j]) {
count++;
}
dp[j++] = count;
}
result = Math.min(result, i + (nums.length - j) + count - dp[i]);
}
return result;
}
}
결과
설명
-
nums 내 숫자들이 연속되도록 구성하고자할 때, 바꿀 최소 숫자의 갯수를 구하는 문제이다.
-
nums의 숫자들을 오름차순으로 정렬한다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 최소 숫자의 갯수를 저장할 변수로, 정수의 최댓값으로 초기화한다.
- count는 바꿀 숫자의 갯수를 계산할 변수로, 0으로 초기화한다.
- dp는 최소 숫자의 갯수를 계산하기 위한 배열로, nums의 길이 크기의 정수 배열로 초기화한다.
- 0부터 nums의 길이 미만까지 i를 증가시키고 j는 1로 초기화 시켜 아래를 반복한다.
- j가 nums의 길이 미만이면서 nums[j]의 값이 $nums[i] + nums.length - 1$보다 같거나 작을 때 까지 아래를 반복한다.
- nums의 $j - 1$번째 숫자와 j번째 숫자가 동일한 경우, 값을 바꿔야 하므로 count를 증가시킨다.
- dp의 j번째 위치에 count를 넣어주고 j를 증가시킨다.
- result에 이전에 계산한 최소 갯수인 result와 $i + (nums.length - j) + count - dp[i]$인 [i, j] 사이 값을 정렬하고 다른 값을 변경할 경우 중 작은 값을 넣어준다.
- j가 nums의 길이 미만이면서 nums[j]의 값이 $nums[i] + nums.length - 1$보다 같거나 작을 때 까지 아래를 반복한다.
- 반복이 완료되면 최소 갯수가 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기