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商品折扣后最终价格题目的完整攻略,供大家参考。

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

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

相关文章

  • Spring框架生成图片验证码实例

    让我来详细讲解一下“Spring框架生成图片验证码实例”的完整攻略。 1. 环境搭建 首先,我们需要搭建好Spring MVC环境,这里就不做过多的讲解了。如果你还不熟悉Spring MVC的环境搭建,可以先学习一下相关的教程,在此不再赘述。 2. 添加依赖 在我们项目的pom.xml文件中,我们需要添加以下依赖: <!– SpringSecurit…

    Java 2023年6月15日
    00
  • MyBatis一对一映射初识教程

    MyBatis一对一映射初识教程 什么是一对一映射? 一对一映射是ORM框架MyBatis中非常重要的概念之一。顾名思义,一对一映射就是一张表中的一行数据与另一张表中的一行数据建立一一对应的关系,也就是说我们从这两张表中查到的数据都是一对一的。在MyBatis中,实现一对一映射的方式是通过两个实体类之间的关联关系来完成的。 一对一映射的实现 在MyBatis…

    Java 2023年5月20日
    00
  • SpringBoot Bean花式注解方法示例下篇

    请听我详细讲解“SpringBoot Bean花式注解方法示例下篇”的完整攻略。 概述 本文主要介绍在Spring Boot项目中常用的Bean注解及其用法,包括@Component、@Service、@Repository、@Controller、@Configuration、@Bean等。 @Component注解 @Component是最常用的注解之一…

    Java 2023年6月3日
    00
  • Spring Boot之内嵌tomcat版本升级操作示例

    Spring Boot之内嵌Tomcat版本升级操作示例 Spring Boot是一个快速开发、便于部署的Java Web框架,它内嵌了Tomcat作为默认的Web容器。本文将介绍如何将Spring Boot内嵌的Tomcat版本升级,帮助开发者更好地使用和优化Spring Boot应用程序。 升级步骤 第一步:查看当前Tomcat版本 首先需要查看当前Sp…

    Java 2023年6月2日
    00
  • Java方法引用原理实例解析

    Java方法引用原理实例解析 Java 8 中引入了方法引用(Method reference)的概念,可以使用方法引用来简化 lambda 表达式的书写。方法引用是指在 lambda 表达式中直接调用一个已经存在的函数或者对象方法,从而可以简化代码,提升程序的可读性和可维护性。 方法引用的语法 方法引用的语法如下: 对象名::方法名 类名::静态方法名 类…

    Java 2023年5月26日
    00
  • 详解JAVA的控制语句

    详解JAVA的控制语句 在Java中,控制语句是实现条件执行和循环执行的基础。本篇文章将详细讲解Java中的控制语句,分别包括if else、while、do while、for、foreach等语句,以及这些语句的作用、语法、注意事项和示例说明。 if else语句 if else 语句是Java中最常用的控制语句之一,它用于实现基于条件的分支执行,如果条…

    Java 2023年5月23日
    00
  • springboot 使用Spring Boot Actuator监控应用小结

    下面是对“springboot使用SpringBootActuator监控应用小结”的详细讲解,包含完整的攻略和示例。 1. 什么是SpringBootActuator SpringBootActuator是SpringBoot框架下的一个辅助工具,可以帮助开发者更好的管理和监控应用程序的运行情况。通过向应用程序的运行时环境中添加各种监控指标,开发者可以实时…

    Java 2023年5月15日
    00
  • Java 如何实现一个http服务器

    下面是 Java 如何实现一个 http 服务器的完整攻略: 1. 了解 HTTP 协议 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个应用层协议,用于在 Web 上传输超文本。在实现自己的 http 服务器之前,需要先对 HTTP 协议有一个基本的了解。 2. 实现一个 HTTP 请求处理器 在 Java 中,可以…

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