- μ ν νμ΄ λ°©λ²μ μκ°νμ§ λͺ»ν λ¬Έμ .
- κ° indexμ λν΄μ μ΄μ indexκΉμ§μ μ΅λ ν© + νμ¬ indexμ κ°μ μ ννλ κ²½μ°, μλ κ²½μ°λ₯Ό μΆμ νμ¬ μ΅λ ν©μ ꡬνλ λ°©μμΌλ‘ νμ΄λ³΄λ €κ³ νμ§λ§ λμ ν μ νμμ λ§λλ λ°©λ²μ΄ μκ°μ΄ μ λμ μ€ν¨ν¨.
- Monotone queueλ₯Ό νμ©ν΄μΌ νλ€.
- Queueμλ μ«μμ index κ°μ μ μ§νλ€.
- Queueμ μμͺ½μλ 쑰건μ λ§μ‘±νλ (κ°μ₯ ν°) subset sum κ°μ κ°λ¦¬ν€λ indexκ° μμΉνλλ‘ νλ€.
- μ΄λ₯Ό μν΄μ queueμ λ€μͺ½μ νμ¬ μμΉμ subset sum
nums[i]
λ³΄λ€ μμ κ°μ΄ μλ κ²½μ° λͺ¨λ μ κ±°νλ€. - κ·Έ λ€μ queueμ νμ¬ subset sum
nums[i]
κ°μ λ£λλ€. - μ΄λ κ² νλ©΄ queueμ μλ κ°μ νμ λ¨μ‘° κ°μνλ ννλ‘ μ μ§λλ€.
- μ μ
μ μΆμ΄λ―λ‘ queueμ μμ μλ indexκ° κ°μ₯ μμ index κ°μ΄λλ€. μ΄ κ°μ΄ λ²μ
k
λ₯Ό λ²μ΄λ κ²½μ° μ κ±°νλ€.
class Solution {
public:
int constrainedSubsetSum(vector<int>& nums, int k) {
deque<int> indices;
int result = nums[0];
for (int i = 0; i < nums.size(); ++i) {
nums[i] += !indices.empty()? nums[indices.front()] : 0;
result = max(result, nums[i]);
while (!indices.empty() && nums[i] > nums[indices.back()])
indices.pop_back();
if (nums[i] > 0)
indices.push_back(i);
if (!indices.empty() && i - indices.front() >= k)
indices.pop_front();
}
return result;
}
};