链接:https://leetcode.cn/problems/final-prices-with-a-special-discount-in-a-shop/solution/-by-xun-ge-v-x51o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目![](https://i-blog.csdnimg.cn/blog_migrate/781a4cb86737ff4f369b464ef155c1e6.png)
示例![](https://i-blog.csdnimg.cn/blog_migrate/453098b7b6ac5525f574405157224621.png)
思路
解题思路
【暴力求解】
题意其实就是让我们在数组中寻找当前位置之后的第一个小于当前位置的元素
不能想到使用双指针,暴力枚举,一个指针指向当前位置,另外一个指针去寻找第一个并当前位置小的元素
【单调栈】
在上述暴力法中,我们遍历了两次数组,时间消耗比较大,但是好在数组长度 <=500 比较小,还不至于超时,但是如果数组长度再长一点,暴力求解就不行了,需要使用单调栈优化
其实单调栈也是暴力枚举,只是优化了寻找第一个小于当前元素的过程
具体实现看代码,注释超级详细
代码
【暴力求解】
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* finalPrices(int* prices, int pricesSize, int* returnSize){
*returnSize = pricesSize;
for(int i = 0, j; i < pricesSize; i++)//枚举每一个元素
{
bool logo = false;//记录是否存在小于值
for(j = i+1; j < pricesSize; j++)//寻找第一个小于值
{
if(prices[i] >= prices[j])
{
logo = true;
break;
}
}
if(logo) prices[i] -= prices[j];//如果存在小于就计算
}
return prices;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/final-prices-with-a-special-discount-in-a-shop/solution/-by-xun-ge-v-x51o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【单调栈】
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* finalPrices(int* prices, int pricesSize, int* returnSize) {
int *ans = (int *)malloc(sizeof(int) * pricesSize);
int stack[pricesSize];//初始化变量
int top = 0;
for (int i = pricesSize - 1; i >= 0; i--) {//枚举每一个元素
while (top > 0 && stack[top - 1] > prices[i]) {//弹出比当前元素大的值
top--;
}
ans[i] = top == 0 ? prices[i] : prices[i] - stack[top - 1];//如果栈中有元素,栈顶即第一个小于值
stack[top++] = prices[i];
}
*returnSize = pricesSize;
return ans;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/final-prices-with-a-special-discount-in-a-shop/solution/-by-xun-ge-v-x51o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。