Leetcode Java Maximum Gap
업데이트:
문제
코드
class Solution {
public int maximumGap(int[] nums) {
int length = nums.length;
if (length < 2) {
return 0;
}
int min = nums[0];
int max = nums[0];
for (int num : nums) {
min = Math.min(min, num);
max = Math.max(max, num);
}
if (min == max) {
return 0;
}
int gap = (int) Math.ceil((double) (max - min) / (length - 1));
int bucketMin[] = new int[length];
int bucketMax[] = new int[length];
Arrays.fill(bucketMin, Integer.MAX_VALUE);
Arrays.fill(bucketMax, Integer.MIN_VALUE);
for (int num : nums) {
int idx = (num - min) / gap;
bucketMin[idx] = Math.min(bucketMin[idx], num);
bucketMax[idx] = Math.max(bucketMax[idx], num);
}
for (int idx = 0; idx < bucketMin.length; ++idx) {
if (bucketMin[idx] != Integer.MAX_VALUE) {
gap = Math.max(gap, bucketMin[idx] - min);
min = bucketMax[idx];
}
}
return gap;
}
}
결과
설명
- 주어진 정수 배열 nums를 정렬된 상태의 인접한 두 값의 최대 차이를 구하는 문제이다.
- 단, 주어진 정수 배열 nums의 크기가 2 미만일 경우 주어진 문제의 결과로 0을 반환한다.
- 문제 풀이의 알고리즘은 Linear time으로 동작해야 하며, Linear extra space을 사용해야한다.
-
주어진 배열 크기가 2 미만인 경우, 0을 주어진 문제의 결과로 반환한다.
-
주어진 배열 nums의 값 중 최솟값과 최댓값을 저장하기 위한 min과 max를 정의하고, nums를 순회하여 min에 최솟값을, max에 최댓값을 넣어준다.
-
min과 max가 동일한 값일 경우 nums에 동일한 값들만 있을 경우이므로, 0을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- gap은 최소 가능한 차이를 나타내며, $\frac{max - min}{length - 1}$의 값을 올림한 값을 저장한다.
- bucketMin과 bucketMax는 nums를 순회할 때 차이의 최솟값과 최댓값을 저장할 배열로, 주어진 배열 nums의 크기로 생성한다.
-
bucketMin에는 int형의 최댓값(2,147,483,647)을, bucketMax에는 int형의 최솟값(-2,147,483,648)을 채워준다.
- 주어진 배열 nums를 반복하여 bucketMin과 bucketMax를 채워준다.
- 각 배열의 index를 저장할 idx에 $\frac{num - min}{gap}$의 값을 넣어준다.
- bucketMin[idx]에는 bucketMin[idx]와 num 중 작은 값을 넣어준다.
- bucketMax[idx]에는 bucketMax[idx]와 num 중 큰 값을 넣어준다.
- bucketMin을 반복하여 nums 배열의 정렬된 상태에서의 인접한 두 값의 최대 차이를 구한다.
- bucketMin[idx]와 int형의 최댓값(2,147,483,647)이 아닌 경우만 아래를 수행한다.
- gap에 gap과 $bucketMin[idx] - min$의 값 중 큰 값을 넣어준다.
- min에는 bucketMax[idx] 값을 임시 저장시켜준다.
- bucketMin[idx]와 int형의 최댓값(2,147,483,647)이 아닌 경우만 아래를 수행한다.
- 반복이 완료되면 nums의 정렬된 상태의 인접한 두 값의 최대 차이를 저장한 gap을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기