μ μ λ°°μ΄(int array)κ° μ£Όμ΄μ§λ©΄ κ°μ₯ ν° μ΄μ΄μ§λ μμλ€μ ν©μ ꡬνμμ€. λ¨, μκ°λ³΅μ‘λλ O(n).
Given an integer array, find the largest consecutive sum of elements.
μμ }
Input: [-1, 3, -1, 5]
Output: 7 // 3 + (-1) + 5
Input: [-5, -3, -1]
Output: -1 // -1
Input: [2, 4, -2, -3, 8]
Output: 9 // 2 + 4 + (-2) + (-3) + 8
λ΄κ° μκ°ν΄λ³Έ νμ΄κ³Όμ |
1.κ·μΉ
- μκ° λ³΅μ‘λλ O(n)μ λλ€.
- λν΄μ§λ μμλ λ°λμ μΈλ±μ€κ° μ΄μ΄μ Έ μμ΄μΌ ν©λλ€. (arr[i] + arr[i+3] κ°μ κ²½μ°λ X)
2.μμ
μκ°λ³΅μ‘λκ° O(n)μ΄λ 2μ€ forλ¬Έμ κ³ λ €νμ§ μμ΅λλ€.
λ°°μ΄μ μ΄ ν©κ³κ°μΌλ‘ μ΄κΈ°νν answerλ³μμ, μΈλ±μ€ iλ²μ§ΈλΆν° n-1λ²μ§ΈκΉμ§μ ν©μ΄ μμλ
λ κ°μ λΉκ΅νμ¬ ν° κ°μ answerμ λ£μ΅λλ€.
λ°°μ΄μ κΈΈμ΄λ§νΌ(n) μ΄ μμ μ λ°λ³΅ν ν 리ν΄ν©λλ€.
3.μ½λ(μκ°λ³΅μ‘λ O(n)?)
int solution(list<int> arr){ int *memo = new int[arr.size() + 1]; int answer = 0, sum = 0; list<int>::iterator it; for (it = arr.begin(); it != arr.end(); it++) sum += *it; while (!arr.empty()) { answer = max((sum -= arr.front()), answer); arr.pop_front(); } delete[] memo; return answer; } | cs |
ν΄μ€κ³Ό μ λ΅μ½λ |
1.ν΄μ€
μ΄ λ¬Έμ λ λκ°μ μ μ λ³μλ‘ νμ¬μ ν©(currentSum) κ³Ό μ 체μ μ μΌ ν° ν©(max Sum)μ μ μ₯ν΄μΌ ν©λλ€.
κ° μμλ§λ€ (currentSum + μμ) κ°μ μμ κ°μ΄λ λΉκ΅νκ³ , λ ν° κ°μ΄ currentSumμ΄ λ©λλ€.
maxSumμ currentSum μ΄ λ°λλλ§λ€ 체ν¬νμ¬ μ μΌ ν° κ°μ μ μ₯νλ©΄ λ©λλ€.
2.μ½λ(μκ° λ³΅μ‘λ: O(n) , κ³΅κ° λ³΅μ‘λ: O(1))
int solution(int[] arr) { int maxSum = arr[0]; int currentSum = arr[0]; for(int i = 1; i < arr.length; i++) { currentSum = Math.max(currentSum + arr[i], arr[i]); maxSum = Math.max(currentSum, maxSum); } return maxSum; } | cs |