Leetcode.1475 商品折扣后的最终价格 简单
简单模拟,两个循环遍历即可
class Solution {
public:
vector<int> finalPrices(vector<int>& prices) {
int n = prices.size();
vector<int> res(n);
for(int i = 0;i < n;i++)
{
res[i] = prices[i];
for(int j = i+1;j < n;j++)
{
if(prices[j] <= prices[i])
{
res[i] -= prices[j];
break;
}
}
}
return res;
}
};
时间复杂度为O(n²),n是数组长度
空间复杂度为O(1),返回值不计入空间复杂度
单调栈
前面的解法使用了双重循环遍历,时间复杂度较大,单调栈的核心思维就是寻找右边更小的元素时不需要遍历数组,
从数组右端开始遍历,
如果栈不为空且栈顶元素比此位置数组元素大,就出栈,重复操作,直到栈为空或者栈顶元素小于此数组元素
然后判断是否栈空,栈空就说明后面没有比此数组元素还要小的元素,就是原价,栈不为空就打折,此时打折的价格就是减去栈顶元素
class Solution {
public:
vector<int> finalPrices(vector<int>& prices) {
int n = prices.size();
vector<int> res(n);
stack<int>sta;
for(int i = n-1;i >= 0;i--)
{
while(!sta.empty() && sta.top() > prices[i])
{
sta.pop();
}
res[i] = sta.empty()?prices[i]:(prices[i] - sta.top());
sta.emplace(prices[i]);
}
return res;
}
};
时间复杂度为O(n),一个循环遍历数组
空间复杂度为O(n),栈占用空间