Leetcode Java Zero Array Transformation II
업데이트:
문제
코드
class Solution {
public int minZeroArray(int[] nums, int[][] queries) {
int length = nums.length;
int sum = 0;
int result = 0;
int[] counts = new int[length + 1];
for (int i = 0; i < length; i++) {
while (sum + counts[i] < nums[i]) {
if (result == queries.length) {
return -1;
} else {
int l = queries[result][0];
int r = queries[result][1];
int val = queries[result][2];
result++;
if (i <= r) {
counts[Math.max(l, i)] += val;
counts[r + 1] -= val;
}
}
}
sum += counts[i];
}
return result;
}
}
결과
설명
- 정수 배열로 이루어진 nums를 이용하여 아래 규칙대로 적용하여 모든 값이 0이 되기 위한 queries의 위치를 찾는 문제이다.
- queries[i] = [li, ri, vali]로, [li, ri] 범위 내 값들을 vali만큼 감소시킨다는 의미이다.
- 각 감소되는 위치 별 값은 0 미만으로 내려가지 않는다.
- 해당 위치가 존재하지 않는 경우, -1을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 nums의 길이를 저장한 변수이다.
- sum은 위치 별 감소될 값을 합쳐 저장할 변수로, 0으로 초기화한다.
- result는 nums의 모든 값을 0으로 되기까지 적용한 queries의 위치를 계산할 변수로, 0으로 초기화한다.
- counts는 각 위치 별 차감되는 갯수를 누계하기 위한 변수로, $length - 1$크기의 정수 배열로 초기화한다.
- 0부터 length 미만까지 i를 증가시키면서 아래를 반복한다.
- $sum + counts[i]$의값이 nums[i] 미만인 차감 가능할 때 까지 아래를 반복한다.
- result가 queries의 길이와 동일한 모든 쿼리 수행이 완료된 경우, 모든 위치의 값이 0으로 될 수 없으므로 -1을 주어진 문제의 결과로 반환한다.
- 위의 경우가 아니라면 l, r, val에 queries[result]의 값들을 순차적으로 넣고 result를 증가시킨 후, i가 r보다 작다면 counts 내 l과 i 중 큰 값에 해당하는 위치에 val을 더해주고, counts[$r + 1$]의 값을 val만큼 감소시켜준다.
- sum에 counts[i]의 값을 더해 감소되는 값을 증가시켜준다.
- $sum + counts[i]$의값이 nums[i] 미만인 차감 가능할 때 까지 아래를 반복한다.
- 반복이 완료되면 적용된 queries의 갯수인 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기