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日

相关文章

  • 关于Java垃圾回收开销降低的几条建议

    关于Java垃圾回收开销降低的几条建议 背景 在Java程序运行时,垃圾回收器自动地回收未被引用的内存,以免Java运行时内存不足。然而,频繁的垃圾回收和内存分配会增加系统的开销。因此,为了降低Java垃圾回收开销,我们可以采取以下几个建议: 建议一:减少内存分配 内存分配是Java运行时系统的开销之一。我们可以采取以下方法来减少内存分配: String处理…

    Java 2023年5月27日
    00
  • Java线程池的分析和使用详解

    Java线程池的分析和使用详解 线程池的概念 线程池(thread pool)是线程管理的一种机制,它能够让我们更加方便地管理大量的线程,避免了频繁地创建和销毁线程,提高了程序的效率。Java中通过java.util.concurrent包提供了线程池的实现。 线程池的特点 控制线程数量 重复利用线程 管理线程 线程池的类型 Java中的线程池主要有以下4种…

    Java 2023年5月19日
    00
  • java虚拟机学习笔记进阶篇

    Java虚拟机学习笔记进阶篇攻略 本文旨在为读者提供Java虚拟机学习笔记进阶篇的学习攻略,包括必要的准备知识、学习方法、学习重点等内容。 准备知识 在学习Java虚拟机进阶篇之前,需要对Java虚拟机的基础知识有清晰的理解,包括但不限于: Java虚拟机的体系结构和工作原理; Java虚拟机的内存模型和内存管理机制; Java字节码的结构、格式和指令集; …

    Java 2023年5月23日
    00
  • JAVA堆排序算法的讲解

    JAVA堆排序算法的讲解 算法简介 堆排序(Heap Sort)是一种选择排序,它的主要思想是将待排序序列构建成一个大顶堆或小顶堆,然后将堆顶元素与最后一个元素交换位置,再对剩余 n – 1 个元素进行同样的操作,依次类推,直到整个序列有序。 堆排序的时间复杂度为 O(nlogn),是一种比较高效的排序算法。 算法步骤 对待排序的序列进行堆的构建,构建出一个…

    Java 2023年5月19日
    00
  • Python中相见恨晚的技巧(记得收藏)

    Python中相见恨晚的技巧(记得收藏) 1. 列表推导式 列表推导式是一种快速创建新列表的方法,可以在一个列表中定义一个条件,然后在新的列表中使用这个条件来过滤和操作原始列表中的元素。 # 原始列表 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 列表推导式,将原始列表中的偶数取出来 even_numbers = [num …

    Java 2023年5月26日
    00
  • Javac/javap 自带工具简单使用讲解

    Javac和Javap是Java语言中自带的两个工具。Javac能够将Java源代码编译为可执行Java字节代码,而Javap则可以将Java字节码反编译为可读性更高的代码。 使用Javac编译Java源代码 Javac是Java编译器,可将Java源文件编译成字节代码。当然,在使用Javac之前,我们需要先下载并安装Java开发工具包(JDK)。以下是使用…

    Java 2023年5月23日
    00
  • jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码

    要实现jQuery EasyUI datagrid在翻页以后仍能记录被选中行所对应数据的功能,我们可以通过以下步骤实现: 步骤一:记录选中行的数据 使用EasyUI datagrid中提供的onSelect和onUnselect事件,分别在用户选中和取消选中某一行的时候,记录该行所对应的数据,并将数据存储在一个数组中。具体代码如下: var selected…

    Java 2023年6月15日
    00
  • Apache Maven3.6.0的下载安装和环境配置(图文教程)

    下面是对“Apache Maven 3.6.0的下载安装和环境配置(图文教程)”的详细讲解。 安装JDK 在安装Maven之前,需要先安装Java JDK。可以从Oracle或OpenJDK下载并安装适合自己操作系统的版本。 下载安装Maven 访问Apache Maven官网(https://maven.apache.org/download.cgi),找…

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