- μ£Όμ΄μ§ λ°°μ΄ arr μ λͺ¨λ μ°μλ λΆλΆ λ°°μ΄ Aijβ=[arr[i],arr[i+1],...,arr[j]](0β€iβ€j<N)μ λν΄μ κ·Έ μ΅μκ° min(Aijβ)μ ν© S=i=0βNβ1βj=iβNβ1βmin(Aijβ) μ ꡬνλ λ¬Έμ .
- κ²°κ³Ό κ°μ΄ λ§€μ° ν΄ μ μμΌλ―λ‘ 109+7λ‘ λλ¨Έμ§ μ°μ°μ μνν΄μ λλ €μ£Όμ΄μΌ νλ€.
- λ¨μνκ² μ κ·Όνλ€λ©΄ κ° λ²μ [i,j] λ³λ‘ μ΅μκ°μ ꡬνλ λ°©μμ μ·¨ν μ μμ κ²μ΄λ€. λ€λ§ μ΄λ κ² νλ©΄ μκ° λ³΅μ‘λκ° O(N2)μ΄ λλ―λ‘ μκ° μ νμ μ΄κ³Όνκ² λλ€.
- λ°°μ΄μ νλ²λ§ μννλ©΄μ κ°μ κ³μ°νκΈ° μν΄μ λΆλΆ λ°°μ΄μ μ΅μκ° κ·μΉμ λ°κ²¬ν νμκ° μλ€.
e.g. arr = [3, 2, 4, 1] μ΄λΌκ³ κ°μ νμ. κ° λΆλΆ λ°°μ΄ λ³ μ΅μκ°μ ꡬνλ©΄ μλμ κ°λ€.
- index = 0
- sub array: [3], [3, 2], [3, 2, 4], [3, 2, 4, 1]
- min value: 3, 2, 2, 1
- index = 1
- sub array: [2], [2, 4], [2, 4, 1]
- min value: 2, 2, 1
- index = 2
- sub array: [4], [4, 1]
- min value: 4, 1
- index = 3
- sub array: [1]
- min value: 1
- μμ κ²°κ³Όλ‘ λΆν° λ€μκ³Ό κ°μ λ‘μ§μ λμΆν μ μλ€.
- λ°°μ΄ arrμ μΆνν κ°μ νλμ© μννλ©΄μ μλ‘μ΄ λ°°μ΄ arrβμ λ£λλ€.
- νμ¬ κ° aiβ=arr[i]μ λνμ¬,
- arrβμ μλ κ° μ€ aiβ λ³΄λ€ ν° λͺ¨λ κ°μ aiβλ‘ λ체νλ€.
- arrβμ μλ κ° μ€ aiβ λ³΄λ€ μμ λͺ¨λ κ°μ κ·Έλλ‘ λλ€.
- arrβμ κ°μ νλ λ£μ λ λ§λ€ arrβμ μλ λͺ¨λ κ°μ κ²°κ³Ό κ°μ λνλ€.
- λ‘μ§ μννμ λ arrβμ μνμ μκ°ννλ©΄ μλμ κ°λ€.
e.g. arr = [3, 2, 4, 1] μ΄λΌκ³ ν λ,
- index = 0 β [3]
- index = 1 β [3 β 2, 2] β [2, 2]
- index = 2 β [2, 2, 4]
- index = 3 β [2 β 1, 2 β 1, 4 β 1, 1] β [1, 1, 1, 1]
- arrβμ κ°μ μ μ₯νκΈ° μν΄μ μ€νμ μ¬μ©νλ©΄ μμ λ‘μ§μ μ½κ² ꡬνν μ μλ€.
- λ¬Έμ λ μ€νμ μ¬μ©νμ λ λͺ¨λ κ°μ μννλ©΄μ λνλ€λ©΄ μ΅μ
μ κ²½μ°μλ μκ° λ³΅μ‘λκ° O(N2)μ΄ λ μ μλ€.
- arrμ κ°μ΄ λ¨μ‘° μ¦κ° aiββ€ajβ(i<j) ν κ²½μ° μ κ±°λλ κ°μ΄ μμ΄ λͺ¨λ κ°μ΄ μ€νμ μΆκ°λλ―λ‘ μ€νμ ν¬κΈ°λ O(N)μ΄ λκΈ° λλ¬Έμ΄λ€.
- λ§€ index λ§λ€ O(N)μ μκ° λ³΅μ‘λλ‘ κ°μ λν΄μΌ νκΈ°μ κ²°κ³Όμ μΌλ‘ μκ° λ³΅μ‘λλ O(N2)κ° λλ€.
- λ°λΌμ μ€νμ λ€μ΄κ° μλ κ°μ ν©μ λ³λμ λ©λͺ¨λ¦¬
currSum
λ‘ μΆμ νλ€λ©΄ μ΄ μκ°μ μλ μ μλ€. - μλ‘κ² κ°μ΄ μΆκ°λλ©΄
currSum
μ λνλ€. - κΈ°μ‘΄μ μλ κ°μ μ κ±°ν λλ
currSum
μμ λΊλ€.
- λν λμΌν κ°μ μ€νμ κ°κ° λ£λ λμ , μ«μ & ν΄λΉ μ«μμ μΆν λΉλλ₯Ό μ μ₯νλ κ²μ΄ μ’μ κ²μ΄λ€.
e.g. arr = [3, 2, 4, 1] μ΄λΌκ³ ν λ, μ€νμ [μ«μ, μ«μμ μΆν λΉλ] λ‘ μ μ₯νλ€.
<λ°κΎΈκΈ° μ >
- index = 0 β [3]
- index = 1 β [2, 2]
- index = 2 β [2, 2, 4]
- index = 3 β [1, 1, 1, 1]
<λ°κΎΌ ν>
- index = 0 β [[3, 1]]
- index = 1 β [[2, 2]]
- index = 2 β [[2, 2], [4, 1]]
- index = 3 β [[1, 4]]
class Solution {
public static final int MOD = 1_000_000_000 + 7;
public int sumSubarrayMins(int[] arr) {
int N = arr.length;
Stack<int[]> stack = new Stack<>();
int currSum = arr[0];
int sum = currSum;
stack.push(new int[]{ arr[0], 1 });
for (int i = 1; i < N; ++i) {
int count = 1;
while (!stack.empty()) {
int[] last = stack.peek();
if (last[0] < arr[i]) break;
stack.pop();
count += last[1];
currSum = (currSum - last[0] * last[1]) % MOD;
}
int[] newPair = new int[]{ arr[i], count };
stack.push(newPair);
currSum = (currSum + newPair[0] * newPair[1]) % MOD;
sum = (sum + currSum) % MOD;
}
return sum;
}
}