题目地址:
https://leetcode.com/problems/final-prices-with-a-special-discount-in-a-shop/
给定一个长 n n n数组 A A A,要求返回一个新数组 B B B,使得 B [ i ] B[i] B[i]等于 A [ i ] A[i] A[i]减去其右边第一个不大于它的数。若不存在不大于它的数,则 B [ i ] B[i] B[i]就等于 A [ i ] A[i] A[i]。
思路是单调栈,开一个严格单调增的栈即可。代码如下:
class Solution {
public int[] finalPrices(int[] prices) {
int[] stk = new int[prices.length];
int top = 0;
for (int i = 0; i < prices.length; i++) {
while (top > 0 && prices[stk[top - 1]] >= prices[i]) {
prices[stk[--top]] -= prices[i];
}
stk[top++] = i;
}
return prices;
}
}
时空复杂度 O ( n ) O(n) O(n)。
C++:
class Solution {
public:
vector<int> finalPrices(vector<int>& v) {
stack<int> stk;
for (int i = 0; i < v.size(); i++) {
while (stk.size() && v[stk.top()] >= v[i]) {
v[stk.top()] -= v[i];
stk.pop();
}
stk.push(i);
}
return v;
}
};
时空复杂度一样。