Java C++ 算法题解leetcode145商品折扣后最终价格单调栈

 更新时间:2022年09月14日 10:11:06   作者:AnjaVon  
这篇文章主要介绍了Java C++ 算法题解leetcode145商品折扣后最终价格单调栈示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路一:暴力模拟

  • 由于数据范围不算离谱,所以直接遍历解决可行。

Java

class Solution {
    public int[] finalPrices(int[] prices) {
        int n = prices.length;
        int[] res = new int[n];
        for (int i = 0; i < n; i++) {
            int discount = 0;
            for (int j = i + 1; j < n && discount == 0; j++) {
                if (prices[j] <= prices[i])
                    discount = prices[j];
            }                
            res[i] = prices[i] - discount;
        }
        return res;
    }
}
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

C++

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        vector<int> res(n);
        for (int i = 0; i < n; i++) {
            int discount = 0;
            for (int j = i + 1; j < n && discount == 0; j++) {
                if (prices[j] <= prices[i])
                    discount = prices[j];
            }
            res[i] = prices[i] - discount;
        }
        return res;
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

Rust

impl Solution {
    pub fn final_prices(prices: Vec<i32>) -> Vec<i32> {
        let n = prices.len();
        let mut res = vec![0;n];
        (0..n).for_each(|i| {
            res[i] = prices[i] - ((i + 1)..n).find(|&j| prices[j] <= prices[i]).map_or(0, |j| prices[j]);
        });
        res
    }
}
  • 遍历存每次的count,最后再遍历计算得出结果
impl Solution {
    pub fn final_prices(prices: Vec<i32>) -> Vec<i32> {
        let n = prices.len();
        let mut discount = vec![0;n];
        for j in 1..n {
            for i in 0..j {
                if discount[i] == 0 && prices[j] <= prices[i] {
                    discount[i] = prices[j];
                }
            }
        }
        prices.iter().zip(discount.iter()).map(|(&x, &y)| x - y).collect::<Vec<i32>>()
    }
}
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

思路二:单调栈

  • 是个逆向思维,不考虑谁是我的折扣,而去考虑我可以是谁的折扣。已知的一个prices[j]只能折扣其左边最近的几个大于它的值,按这个思路分析单调
    • 从前向后依次遍历prices,遇到需要打折的商品,将其下标放入一个容器
      • 若当前处理值小于末尾,那么它就可以作为末尾元素的折扣【因为它是末尾元素后面第一个小于它的值】,将末尾元素取出、折扣、放入已折扣数组(即结果数组),一直重复到容器末尾元素小于当前处理值,则将当前处理值放入容器【为避免该值不可打折造成缺漏,此时将其价格同步至已折扣数组】。
      • 若当前处理的值高于容器内的值,那么它不能作为里面任何一者的折扣,因此直接加入容器。
    • 由此可知,加入容器值会大于容器内的其它值,该容器是单调递增的。此外,处理的一直是容器末尾的元素,添加也是直接补在末尾,所以符合的结构。

Java

class Solution {
    public int[] finalPrices(int[] prices) {
        int n = prices.length;
        int[] res = new int[n]; // 已打折价格
        Deque<Integer> sta = new ArrayDeque<>(); // 待打折下标
        for (int i = 0; i < n; i++) {
            while (!sta.isEmpty() && prices[sta.peekLast()] >= prices[i]) {
                int idx = sta.pollLast();
                res[idx] = prices[idx] - prices[i];
            }
            sta.addLast(i); // 最高
            res[i] = prices[i];
        }
        return res;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

C++

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        vector<int> res(n); // 已打折价格
        stack<int> sta; // 待打折下标
        for (int i = 0; i < n; i++) {
            while (!sta.empty() && prices[sta.top()] >= prices[i]) {
                int idx = sta.top();
                sta.pop();
                res[idx] = prices[idx] - prices[i];
            }
            sta.push(i); // 最高
            res[i] = prices[i];
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

Rust

impl Solution {
    pub fn final_prices(prices: Vec<i32>) -> Vec<i32> {
        let n = prices.len();
        let mut res = vec![0;n]; // 已打折价格
        let mut sta = vec![]; // 待打折下标
        for i in 0..n {
            while let Some(&idx) = sta.last() {
                if prices[idx] < prices[i] {
                    break;
                }
                sta.pop();
                res[idx] = prices[idx] - prices[i];
            }
            sta.push(i); // 最高
            res[i] = prices[i];
        }
        res
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

以上就是Java C++ 算法题解leetcode145商品折扣后最终价格单调栈的详细内容,更多关于Java C++ 商品折扣后价格的资料请关注脚本之家其它相关文章!

相关文章

  • C++详细讲解内存管理工具primitives

    C++详细讲解内存管理工具primitives

    文章向大家介绍C++内存管理primitives,主要包括primitives使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • 详解C++类的成员函数做友元产生的循环依赖问题

    详解C++类的成员函数做友元产生的循环依赖问题

    这篇文章主要为大家详细介绍了C++类的成员函数做友元产生的循环依赖问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 从头学习C语言之二维数组

    从头学习C语言之二维数组

    这篇文章主要为大家详细介绍了C语言之二维数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 求数组中最长递增子序列的解决方法

    求数组中最长递增子序列的解决方法

    本篇文章是对c++中求数组中最长递增子序列的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Opencv实现拼图板游戏

    Opencv实现拼图板游戏

    这篇文章主要为大家详细介绍了Opencv实现拼图板小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • c/c++单例模式类的混合编译案例详解

    c/c++单例模式类的混合编译案例详解

    ​ 由于c语言中没有类的概念,因此对于有类的cpp文件与c文件混合编译时,提供一个中间层提供类的操作接口,在c文件中调用接口实现间接操作类对象,这篇文章主要介绍了c/c++单例模式类的混合编译的相关资料
    2022-10-10
  • 浅理解C++ 人脸识别系统的实现

    浅理解C++ 人脸识别系统的实现

    这篇文章主要介绍了浅理解C++ 人脸识别系统的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C语言中打印特殊图案的实现代码

    C语言中打印特殊图案的实现代码

    以下代码实现了在C语言中打印特殊图案的解决方法。需要的朋友参考下
    2013-05-05
  • C语言/C++中如何产生随机数

    C语言/C++中如何产生随机数

    这里要用到的是rand()函数, srand()函数,和time()函数。需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件
    2013-10-10
  • c语言数据结构之栈和队列详解(Stack&Queue)

    c语言数据结构之栈和队列详解(Stack&Queue)

    这篇文章主要介绍了c语言数据结构之栈和队列详解(Stack&Queue),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论