[2024] day 218. Leetcode 1508. Range Sum of Sorted Subarray Sums

gunny·2024년 8월 5일
0

코딩테스트

목록 보기
528/530

2024년부터 새롭게 다시 시작하는 코딩테스트

2024년 8월 4일 (일)
Leetcode daily problem

1508. Range Sum of Sorted Subarray Sums

https://leetcode.com/problems/range-sum-of-sorted-subarray-sums/?envType=daily-question&envId=2024-08-04

Problem

n개의 정수로 이루어진 배열 nums가 주어질 때, 배열에서 비어 있지 않은 모든 연속 하위 배열의 합계를 계산한 다음 이를 내림차순으로 정렬하여 n * (n + 1) / 2 숫자의 새 배열을 생성했습니다.

새 배열에서 왼쪽 인덱스부터 오른쪽 인덱스(1부터 인덱스 지정)까지의 숫자 합계를 반환한다. 이 때 대답은 큰 숫자일 수 있으므로 10^9 + 7을 반환합니다.

Solution

binary search & sliding window

이 문제를 푸는 방법은
(1) brute force
(2) priority queue(우선순위 큐)
(3) binary search & sliding window(이진 분류 & 슬라이딩 윈도우) 로 풀 수 있다.

먼저 가장 쉽고 이해하기 쉬운 brute fore로 푸는 방법은
주어진 배열의 모든 부분 배열의 합을 계산해서 새로운 배열에 저장하고, 이 배열을 비내림차순으로(오름차순) 정렬하고 주어진 왼쪽 인덱스와 오른쪽 인덱스 사이의 요소들의 합을 구하는 방법이다.

Code

class Solution:
    def rangeSum(self, nums: List[int], n: int, left: int, right: int) -> int:
        sub_arr = []
        for i in range(len(nums)):
            total = 0
            for j in range(i, len(nums)):
                total += nums[j]
                sub_arr.append(total)
                
        sub_arr.sort()
        ans = 0 
        for i in range(left-1, right):
            ans = ( ans + sub_arr[i] ) % (10**9+7)
            
        return ans

Complexicity

시간 복잡도

위 코드에서 for i in range(len(nums)) 에서 num의 길이에 해당하는 n번 실행되고 for j in range(i, len(nums)) 에서 내부루프는 최악의 경우 n번 실행 될 수 있어 O(n^2) 이다.

루프를 돌고 부분합을 저정한 sub_arr의 길이는 n(n+1)/2 이고, 시간복잡도는 O(n^2/2 log n^2/2)로 O(n^2 logn)이다.
범위의 합은 right-left+1 번 실행되어 n^2와 비례한다.
즉, 부분 배열의 합을 계산하고 범위의 합을 계산할 때 O(n^2)
정렬시 O(n^2logn)으로 최종 시간복잡도는 O(n^2
logn)이다.

공간 복잡도

공간복잡도로는 모든 부분 배열의 합을 저장하므로 배열의 크기 n(n+1)/2으로 O(n^2)을 차지한다.

priority queue, binary search + sliding window로 최적화 하는 방법은 다음에 추가 !
생각보다 이해가 안돼서 천천히 봐야겠다

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글