leetcode1475. 商品折扣后的最终价格 【单调栈】

这篇具有很好参考价值的文章主要介绍了leetcode1475. 商品折扣后的最终价格 【单调栈】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单题

第一次错误做法

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        stack<int> st;
        unordered_map<int, int> mp;
        int i = 0;
        while(i != prices.size()) {
            int t = prices[i];
            if (st.empty() || t > st.top()) {
                st.push(t);
                i++;
            }
            else if (t <= st.top()) {
                int x = st.top();
                st.pop();
                mp[x] = x - t;
            }
        }
        while (!st.empty()) {
            int x = st.top();
            mp[x] = x;
            st.pop();
        }
        vector<int> ans;
        for(int i = 0; i < n; i++){
            ans.push_back(mp[prices[i]]);
        }
        return ans;
    }
};

运行结果:

leetcode1475. 商品折扣后的最终价格 【单调栈】,LeetCode,算法,leetcode,数据结构

错误分析:入栈的是元素,如果之后出现相等的元素,则会覆盖哈希表中的值。

正确思路:

leetcode1475. 商品折扣后的最终价格 【单调栈】,LeetCode,算法,leetcode,数据结构

修改入栈元素为下标之后:

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        stack<int> st;
        vector<int> num(n);
        int i = 0;
        while(i != prices.size()) {
            int t = prices[i];
            if (st.empty() || t > prices[st.top()]) {
                st.push(i);
                i++;
            }
            else if (t <= prices[st.top()]) {
                int x = st.top();
                st.pop();
                num[x] = prices[x] - t;
            }
        }
        // 如果栈中还有元素(数组中没有比它小的值,没得优惠,就只能付原价啦)
        while (!st.empty()) {
            int x = st.top();
            num[x] = prices[x];
            st.pop();
        }
        return num;
    }
};

leetcode1475. 商品折扣后的最终价格 【单调栈】,LeetCode,算法,leetcode,数据结构

for遍历数组元素写法:

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        vector<int> ans(n);
        stack<int> st;
        for (int i = 0; i < n; i++) {
            int t = prices[i];
            while (!st.empty() && t <= prices[st.top()]) {
                int x = st.top();
                ans[x] = prices[x] - t;
                st.pop();
            }
            while (st.empty() || t > prices[st.top()]) {
                st.push(i);
            }
        }
        while (!st.empty()) {
            int x = st.top();
            ans[x] = prices[x];
            st.pop();
        }
        return ans;
    }
};

leetcode1475. 商品折扣后的最终价格 【单调栈】,LeetCode,算法,leetcode,数据结构

 为什么运行时间变长了?文章来源地址https://www.toymoban.com/news/detail-671773.html

到了这里,关于leetcode1475. 商品折扣后的最终价格 【单调栈】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单调栈】LeetCode1776:车队

    【贪心算法】【中位贪心】.执行操作使频率分数最大 单调栈分类、封装和总结 在一条单车道上有 n 辆车,它们朝着同样的方向行驶。给你一个长度为 n 的数组 cars ,其中 cars[i] = [positioni, speedi] ,它表示: positioni 是第 i 辆车和道路起点之间的距离(单位:米)。题目保证

    2024年02月04日
    浏览(30)
  • 单调栈【leetcode】

    笔记:代码随想录 单调栈:需要自己维持顺序,没有现成容器可以用。 1.每日温度 单调栈使用规则: 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了 。时间复杂度为O(n)。空间复杂度O(n)。 本质:空

    2024年02月03日
    浏览(24)
  • LeetCode 热题100——单调栈

    ​   个人主页: 日刷百题 系列专栏 : 〖C语言小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 递增单调栈:栈中元素从栈底到栈顶依次增大 递减单调栈:栈中元素从栈底到栈顶依次减小 在学习完朴素的数据结构栈之后,

    2024年02月04日
    浏览(31)
  • ecshop实现针对不同支付方式对应不同价格折扣的方法

    本文实例讲述了ecshop实现针对不同支付方式对应不同价格折扣的方法。分享给大家供大家参考,具体如下: 不少用户希望ecshop可以实现实现不同的支付方式对应不同的价格折扣,默认的模板没有这个功能. 第一步 :找到:includes/lib_order.php, themes/../order_total.lib 第二步 :修改order

    2023年04月24日
    浏览(266)
  • leetcode739. 每日温度 单调栈

    自己思路: 想到用两个栈,一个维护元素、另一个维护下标。但是还是无法处理有重复元素的问题(用哈希表来存储的时候)。所以就看了答案的思路。 答案思路: 从前往后遍历,维护一个单调栈。栈存放数组的下标。 ①栈为空 or 当前下标元素 = 栈顶元素,入栈; ②当前

    2024年02月11日
    浏览(24)
  • leetcode 738. 单调递增的数字

             这题用暴力法会超时,我就没试了,采用了个挺巧的方法,为了方便需要先将整数n转换为字符串的形式,然后从后向前遍历,当两个数字非递增时,将前一个数字--,后一个数字的位置记录在index中,之后需要将这个index以后的数字全赋为9。  为了防止将不需要赋

    2024年02月14日
    浏览(27)
  • 【Leetcode】 738. 单调递增的数字

    当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是 单调递增 的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1 : 输入 : n = 10 输出 : 9 示例 2 : 输入 : n = 1234 输出 : 1234 示例3 : 输入 : n = 332 输出 : 299 提示: AC : 需要注意的点

    2024年02月07日
    浏览(27)
  • LeetCode42.接雨水(单调栈)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 思路: 从题目中我们可以知道:只有凹陷的地方才可以存储雨水,那么高度一定是先减后增,所以当我们遍历到 增 这个位置时,前面减的地方(即凹陷的地方)一定会存储

    2024年02月21日
    浏览(28)
  • Leetcode刷题笔记——单调性

    单调性是数学中使用的一种常见性质,通常用于描述函数,在高等数学中的定义常常为: 设函数f(x)在区间I上有定义,如果对于I上的任意两个数x1和x2,当x1x2时,有f(x1)f(x2)(或者f(x1)f(x2)),则称函数f(x)在区间I上是单调递增的(或者单调递减的)。 例如如下图像就是两个单

    2024年02月11日
    浏览(27)
  • LeetCode打卡 day58--单调栈

    单调栈的应用, 就是需要构建一个单调递增或者单调递减的栈, 去解决下一个大(小)的元素的问题 题目链接 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包