Leetcode Java Arithmetic Subarrays
업데이트:
문제
코드
class Solution {
public List<Boolean> checkArithmeticSubarrays(int[] nums, int[] l, int[] r) {
List<Boolean> result = new ArrayList<>();
for (int i = 0; i < l.length; i++) {
result.add(this.checkArithmeticSubarrays(nums, l[i], r[i]));
}
return result;
}
private boolean checkArithmeticSubarrays(int[] nums, int left, int right) {
if (right - left < 2) {
return true;
}
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i = left; i <= right; i++) {
min = Math.min(min, nums[i]);
max = Math.max(max, nums[i]);
}
int diff = max - min;
int length = right - left;
if (diff % length != 0) {
return false;
}
if (diff % length != 0) {
return false;
}
diff /= length;
if (diff == 0) {
return true;
}
boolean[] visited = new boolean[length + 1];
for (int i = left; i <= right; i++) {
int value = nums[i] - min;
if (value % diff != 0) {
return false;
} else {
int index = value / diff;
if (visited[index]) {
return false;
} else {
visited[index] = true;
}
}
}
return true;
}
}
결과
설명
-
nums 내 [l[i], r[i]] 범위의 부분 배열로 산술(등차) 수열을 만들 수 있는지 검증하는 문제이다.
-
결과를 넣을 result를 정의하고, l과 r의 처음부터 끝까지 값들을 이용하여 3번에서 정의한 checkArithmeticSubarrays(int[] nums, int left, int right)를 수행한 결과를 result에 넣어 주어진 문제의 결과로 반환한다.
-
[left, right] 범위 내 산술 수열을 검증하기 위한 checkArithmeticSubarrays(int[] nums, int left, int right) 메서드를 정의한다.
- $right - left$가 2 미만인 경우, 무조건 산술 수열이므로 true를 반환한다.
- min과 max에 위의 범위 내 최솟값과 최댓값을 넣어준다.
- diff는 $max - min$인 차잇값을, length는 $right - left$의 숫자 갯수를 넣어준다.
- diff에 length를 나눈 나머지 값이 0이 아닌 경우, 등차 수열을 이룰 수 없으므로 false를 반환한다.
- diff에 legnth를 나눈 값을 넣어주고 해당 값이 0인 경우, 등차 수열을 이룰 수 있으므로 true를 반환한다.
- visited는 동일한 값이 발생했는지 확인하기 위한 배열로, $length + 1$ 크기의 부울 배열로 초기화한다.
- left부터 right 이하까지 i를 증가시키며 아래를 반복한다.
- value에 $nums[i] - min$인 등차 수열의 증가치를 넣어준다.
- value를 diff로 나눈 나머지가 0이 아닌 경우 false를 반환한다.
- 위의 경우가 아니라면 value를 diff로 나눈 값이 visited에 존재하면 false를 반환하고, 없으면 visited의 해당 위치 값을 true로 바꾸어준다.
- 반복이 완료되면 nums의 [left, right] 구간의 값들로 등차 수열을 이룰 수 있는지 검증이 완료되었으므로, true를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기