넘치게 채우기
[LeetCode] 2461. Maximum Sum of Distinct Subarrays With Length K 본문
[LeetCode] 2461. Maximum Sum of Distinct Subarrays With Length K
riveroverflow 2024. 11. 19. 13:57leetcode - Maximum Sum of Distinct Subarrays With Length K
문제 유형: 슬라이딩 윈도우
문제 난이도: Medium
문제
You are given an integer array nums and an integer k. Find the maximum subarray sum of all the subarrays of nums that meet the following conditions:
- The length of the subarray is k, and
- All the elements of the subarray are distinct.
Return the maximum subarray sum of all the subarrays that meet the conditions. If no subarray meets the conditions, return 0.
A subarray is a contiguous non-empty sequence of elements within an array.
정수 배열 nums와 정수 k를 받는다.
k만큼의 길이를 가지고 모든 요소가 중복되지 않는 부분배열의 최대 합을 구하시오.
풀이
sum은 현재 윈도우의 누적합,
freq[i]는 i의 빈도를 저장하는 목적으로 있다.
중복요소의 개수를 추적하는 dup도 만든다.
배열을 순차적으로 순회하면서, freq[nums[i]]에 빈도를 업데이트한다. 만약 2가 된다면, 중복이 생기는 것이므로 dup을 1 추가한다.
만약 i가 k-1이상이라서, 현재 윈도우의 크기가 k가 되었다면, 동시에 dup이 0이라면, 최대 합을 업데이트한다.
그리고, 맨 뒤 요소를 제거할 것이다. sum에서 nums[i-k+1]을 없애고, freq에서도 1 낮춘다.
만약 이번에 freq가 1이 되었다면, dup을 1 낮춘다.
최종적인 최대값을 반환한다.
코드
C++
#pragma GCC optimize("O3", "unroll-loops");
static const int __ = [](){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();
class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
long long res = 0;
int n = nums.size();
vector<int> freq(100001, 0);
long long sum = 0;
int dup = 0;
for(int i = 0; i < n; ++i) {
freq[nums[i]]++;
if(freq[nums[i]] == 2) dup++;
sum += nums[i];
if(i >= k-1) {
if(dup == 0) res = max(res, sum);
sum -= nums[i-k+1];
freq[nums[i-k+1]]--;
if(freq[nums[i-k+1]] == 1) dup--;
}
}
return res;
}
};
'PS > LeetCode' 카테고리의 다른 글
[LeetCode] 2257. Count Unguarded Cells in the Grid (0) | 2024.11.21 |
---|---|
[LeetCode] 2516. Take K of Each Character From Left and Right (0) | 2024.11.20 |
[LeetCode] 1652. Defuse the Bomb (0) | 2024.11.18 |
[LeetCode] 862. Shortest Subarray with Sum at Least K (0) | 2024.11.17 |
[LeetCode] 3254. Find the Power of K-Size Subarrays I (0) | 2024.11.16 |