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

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

简介

本文主要介绍了使用单调栈实现leetcode145道题目的算法思路以及Java、C++两种语言的代码实现。

题目描述:给定一个数组prices表示商品每一天的价格,并且在购买这个商品时,会给出一个最大的折扣价格,那么在每天商品的价格和折扣价格之间取一个较低的价钱,输出折扣后的最终价格。

算法思路

使用单调栈实现该题目的算法步骤如下:

  • 构建一个单调递减栈;
  • 遍历原始数组,如果当前元素小于等于栈顶元素,则入栈;
  • 如果当前元素大于栈顶元素,则弹出栈顶元素,计算折扣后的价格,并将结果保存到数组中;
  • 遍历完整个数组后,单调栈中剩余的元素均为没有折扣的商品,将它们的价格保存到数组中即可。

Java代码实现示例

public int[] finalPrices(int[] prices) {
    int n = prices.length;
    int[] res = new int[n];
    Arrays.fill(res, -1); //设置默认折扣为 -1

    Stack<Integer> stack = new Stack<>();
    for (int i = 0; i < n; i++) {
        while (!stack.isEmpty() && prices[i] <= prices[stack.peek()]) {
            int j = stack.pop();
            res[j] = prices[j] - prices[i];
        }
        stack.push(i);
    }

    for (int i = 0; i < n; i++) {
        if (res[i] == -1) {
            res[i] = prices[i];
        }
    }

    return res;
}

C++代码实现示例

vector<int> finalPrices(vector<int>& prices) {
    int n = prices.size();
    vector<int> res(n, -1);

    stack<int> stack;
    for (int i = 0; i < n; i++) {
        while (!stack.empty() && prices[i] <= prices[stack.top()]) {
            int j = stack.top();
            stack.pop();
            res[j] = prices[j] - prices[i];
        }
        stack.push(i);
    }

    for (int i = 0; i < n; i++) {
        if (res[i] == -1) {
            res[i] = prices[i];
        }
    }

    return res;
}

示例说明

  • 示例1:

输入: prices = [8,4,6,2,3]

输出: [4,2,4,2,3]

  • 示例2:

输入: prices = [1,2,3,4,5]

输出: [1,2,3,4,5]

以上是使用单调栈实现leetcode145商品折扣后最终价格题目的完整攻略,供大家参考。

阅读剩余 49%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++ 算法题解leetcode145商品折扣后最终价格单调栈 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JAVA8 lambda表达式权威教程

    JAVA8 lambda表达式权威教程攻略 什么是lambda表达式 Lambda表达式是一种在JDK8中引入的函数式编程语法,用于简化代码中的匿名内部类的使用。它可以在不需要实现某个接口的情况下,直接创建出一个函数式接口的实例。 Lambda表达式的基本语法 (parameter) -> expression (parameter) -> { …

    Java 2023年5月26日
    00
  • Eclipse连接Mysql数据库操作总结

    下面是Eclipse连接Mysql数据库操作的完整攻略: 1. 导入Mysql驱动 在Eclipse中,我们需要先导入Mysql的驱动库。可以从Mysql的官网下载最新的JDBC驱动程序(通常是一个jar包),然后将其导入到项目的classpath路径下面即可。 <!– 导入Mysql驱动 –> <dependency> <…

    Java 2023年5月20日
    00
  • IDEA中打jar包的2种方式(Maven打jar包)

    在IDEA中打jar包有两种方式,分别是使用IDEA自带的打包工具和利用Maven插件进行打包。 使用IDEA自带的打包工具 方式一:使用IDEA的界面进行打包 在IDEA中打开你的项目 在Project面板中,找到需要打包的模块并右键选择Open Module Settings 在左侧选择Artifacts选项卡 点击+按钮添加一个新的JAR 配置打包的内…

    Java 2023年6月2日
    00
  • 解决Tomcat启动失败:严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败

    当我们使用Tomcat作为Web服务器时,有时会在启动过程中遇到“初始化组件失败”的错误提示,通常会伴随着“严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException”这样的堆栈信息。这种问题的出现一般都是由于我们的应用程序存在一些不兼容、缺失或者错误的依赖库,或者是Tom…

    Java 2023年5月19日
    00
  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例

    下面我来详细讲解一下“Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例”的完整攻略。 1. 环境准备 首先,我们需要准备好以下环境: JDK 1.8 Spring Boot 2.3.4.RELEASE Spring Data JPA 2.3.4.RELEASE MySQL 8.0.21 Maven 3.…

    Java 2023年5月20日
    00
  • js分页代码分享

    下面我来详细讲解一下“js分页代码分享”的完整攻略。 1. 理解分页原理 在开始编写分页代码之前,我们需要先理解分页的基本原理。分页的本质是将一组数据按照固定数量进行切割,每次只展示其中的一部分,而用户可以通过翻页的方式查看完整数据,其中翻页操作主要是通过修改 URL 参数、AJAX 异步加载新数据或重新渲染页面等方式实现。 2. 分页代码实现 实现分页代码…

    Java 2023年6月16日
    00
  • SpringMVC五种类型参数传递及json传递参数

    Spring MVC是一种常用的Web框架,它提供了多种参数传递方式,包括基本类型、对象、集合、数组和JSON等。本文将详细讲解Spring MVC五种类型参数传递及JSON传递参数,并提供两个示例说明。 五种类型参数传递 1. 基本类型参数传递 基本类型参数传递是指将基本类型的值作为请求参数传递给Controller方法。在Spring MVC中,我们可以…

    Java 2023年5月18日
    00
  • SpringBoot打成war包在tomcat或wildfly下运行的方法

    下面是讲解 Spring Boot 打成 WAR 包以及在 Tomcat 或 Wildfly 上运行的详细攻略: 1. Spring Boot 打成 WAR 包 Spring Boot 默认情况下是以嵌入式 Tomcat 启动的,如果我们希望将 Spring Boot 应用部署到外部 Tomcat 或 Wildfly 中,我们可以将其打包成 WAR 包。 1…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部