728x90
배열이 주어졌을때 maximum subarray 를 찾고자 한다.
본인의 경우 배열 내에서 가장 큰 값이 지속되는 구간을 찾아아 시작 인덱스와 종료 인덱스를 추출해야 했다.
- 시간 복잡도 O(N)
개념
- 각각의 최대 부분 합은 이전 최대 부분 합이 반영된 결과이다.
- 이전 인덱스가 가질 수 있는 최대 부분 합에 현재 인덱스 값을 더하면 현재 인덱스가 가질 수 있는 최대 부분 합을 구할 수 있음을 의미한다.
방법
- 각각의 인덱스 값은 이전 인덱스가 갖고 있는 최대 부분 합을 연장할지 아니면 자신의 값으로 초기화 할지 선택한다.
- 연장
- 이전 인덱스의 최대 부분합 + 현재 인덱스의 최대 부분 합 > 현재 인덱스 값
- Math.max(A[i],A[i] + A[i-1])
적용 코드
public AvailableScheduleResultResponse getResult(Long scheduleId,Long groupId){
Map<LocalDateTime,Integer> resultMap = getResultMap(groupId,scheduleId);
int temp_index=0;
int maxSum =Integer.MIN_VALUE;
int currentSum = Integer.MIN_VALUE;
LocalDateTime maxStart=LocalDateTime.MIN;
LocalDateTime maxEnd= LocalDateTime.MIN;
LocalDateTime currentStart=LocalDateTime.MIN;
LocalDateTime currentEnd=LocalDateTime.MIN;
for (Map.Entry<LocalDateTime,Integer> entry : resultMap.entrySet()){
if(temp_index==0){
maxStart = maxEnd = currentStart = currentEnd = entry.getKey();
maxSum=currentSum=entry.getValue();
temp_index++;
}
if(entry.getValue().compareTo(resultMap.get(currentEnd))==0 ) {
currentEnd = entry.getKey();
}else{
currentSum = entry.getValue();
currentStart = entry.getKey();
currentEnd = entry.getKey();
}
if(currentSum>=maxSum){
maxSum = currentSum;
maxStart = currentStart;
maxEnd = currentEnd;
}
}
return AvailableScheduleResultResponse.builder()
.availableStartTime(maxStart)
.availableEndTime(maxEnd)
.availableNum(maxSum)
.build();
}
728x90
'🐣 알고리즘 삐약 > ✌️알고리즘 개념 잡기' 카테고리의 다른 글
Hash | 해시 (0) | 2024.10.31 |
---|---|
백트래킹 (0) | 2024.08.13 |
[Factors] gcd, lcm Theorem | C++ / Cpp (0) | 2022.05.24 |
[Prime] 에라토스 테네스의 체 | C++ / Cpp (0) | 2022.05.24 |
[소수 & 약수] Prime | C++ / Cpp (0) | 2022.05.24 |