Leetcode Java Maximum Sum Circular Subarray
업데이트:
문제
코드
class Solution {
public int maxSubarraySumCircular(int[] nums) {
int max1 = this.getMaximumSubarray(nums);
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
nums[i] = -nums[i];
}
int max2 = sum + this.getMaximumSubarray(nums);
if (max2 == 0) {
return max1;
} else {
return Math.max(max1, max2);
}
}
private int getMaximumSubarray(int[] nums) {
int sum = nums[0];
int max = nums[0];
for (int i = 1; i < nums.length; i++) {
sum = Math.max(sum + nums[i], nums[i]);
max = Math.max(max, sum);
}
return max;
}
}
결과
설명
-
원형으로 이어진 숫자들이 저장된 nums를 이용하여 비어있지 않은 부분 배열의 최대 합을 반환하는 문제이다.
-
max1에 nums를 이용하여 원형이 아닌 상태에서 부분 배열의 최대 합을 3번에서 정의한 getMaximumSubarray(int[] nums) 메서드 수행한 결과를 넣어준다.
- Kadane’s Algorithm을 이용하여 부분 배열의 최대 합을 구하기 위한 getMaximumSubarray(int[] nums)를 정의한다.
- 부분 배열의 최대 합을 구하기 위한 변수를 정의한다.
- sum은 부분 배열의 최대 합을 계산하기 위한 변수로, nums의 첫 번째 값으로 초기화한다.
- max는 부분 배열의 최대 합이 가장 큰 값을 구하기 위한 변수로, nums의 첫 번째 값을 초기화한다.
- 1부터 nums의 길이 미만까지 i를 증가시키며 아래를 수행한다.
- sum에 sum에 nums의 i번째 값을 더한 값과 nums의 i번째 값 중 큰 값을 넣어준다.
- max에는 max와 sum 중 큰 부분 배열의 합을 넣어준다.
- 구해진 부분 배열의 최대 합이 저장된 max를 반환한다.
- 부분 배열의 최대 합을 구하기 위한 변수를 정의한다.
-
sum을 0으로 초기화하고 nums의 모든 값을 이용하여 합을 넣고, 모든 값을 음수/양수로 반전시킨다.
-
max2에 nums를 이용하여 원현인 상태에서 부분 배열의 최대 합을 3번에서 정의한 getMaximumSubarray(int[] nums) 메서드 수행한 결과에 sum을 더해서 넣어준다.
- max2가 0인 경우, max1을 아니면 max1과 max2 중 큰 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기