首页 > 其他分享 >力扣-901. 股票价格跨度

力扣-901. 股票价格跨度

时间:2024-05-17 23:19:43浏览次数:28  
标签:901 int price stk 力扣 prices StockSpanner next 跨度

1.题目

题目地址(901. 股票价格跨度 - 力扣(LeetCode))

https://leetcode.cn/problems/online-stock-span/

题目描述

设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度

当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。

  • 例如,如果未来 7 天股票的价格是 [100,80,60,70,60,75,85],那么股票跨度将是 [1,1,1,2,1,4,6]

实现 StockSpanner 类:

  • StockSpanner() 初始化类对象。
  • int next(int price) 给出今天的股价 price ,返回该股票当日价格的 跨度

 

示例:

输入:
["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
[[], [100], [80], [60], [70], [60], [75], [85]]
输出:
[null, 1, 1, 1, 2, 1, 4, 6]

解释:
StockSpanner stockSpanner = new StockSpanner();
stockSpanner.next(100); // 返回 1
stockSpanner.next(80);  // 返回 1
stockSpanner.next(60);  // 返回 1
stockSpanner.next(70);  // 返回 2
stockSpanner.next(60);  // 返回 1
stockSpanner.next(75);  // 返回 4 ,因为截至今天的最后 4 个股价 (包括今天的股价 75) 都小于或等于今天的股价。
stockSpanner.next(85);  // 返回 6

 

提示:

  • 1 <= price <= 105
  • 最多调用 next 方法 104

2.题解

2.1单调栈

思路

这里寻找股票价格小于或等于今天价格的最大连续日数, 反过来说,不成立条件就是寻找左侧最近的更大值(大于当前日股票价格,连续日数就中断了)
这里寻找左侧更大值,也就是寻找prices[stk.top()] > price, 所以反过来我们这里while执行的条件就是prices[stk.top()] <= price
我们使用了一个数组来保存之前的股票值,并且通过数组大小判断当前位置索引
1.如果栈空,说明当前股价是目前遇到的最大值,这时候其实第一个不满足条件的索引值可以看做是-1, 所以距离就是i-(-1)=i+1
2.如果栈不为空,而是遇到了某个更大的值停了下来,获得它的索引, 距离是i-index(为何不加一?因为这是第一个不满足的值,而不是最后一个满足的值)

但是这里我们额外用了一个数组,可以思考一下如何去除这个数组的使用

代码

  • 语言支持:C++

C++ Code:


class StockSpanner {
public:
    StockSpanner() {}
    
    int next(int price) {       
        while(!stk.empty() && price >= prices[stk.top()]){
            stk.pop();
        }      
        prices.push_back(price);
        int i = prices.size() - 1;
        int ans = stk.empty()?(i + 1) : i - stk.top();
        stk.push(i);
        return ans;
    }
private:
    vector<int> prices;
    stack<int> stk;
};

/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner* obj = new StockSpanner();
 * int param_1 = obj->next(price);
 */

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

2.2 单调栈(改进,不使用数组记录)

思路

如果不使用数组记录,我们要解决两个使用prices数组的替换
1.prices[stk.top()],我们之前栈中保存的是索引值,我们如何通过索引值获取相应值的大小?
2.int i = prices.size() - 1; 这里我们获取当前元素的索引值用的是数组大小来求的,如果不使用,该如何获取?

解决:
1.我们的栈不仅记录索引值,也记录相应值(stack中存储一个pair元素即可)
2.我们使用一个成员变量idx记录当前元素的索引值,每次操作的时候idx++即可

备注:这里还进行了一个小优化,本来我们要判断栈是否为空,这里预先往栈中添加了一个(-1,INT_MAX)保证栈不为空

代码

class StockSpanner {
public:
    StockSpanner() {
        this->idx = -1;
        this->stk.emplace(-1,INT_MAX);
    }
    
    int next(int price) {       
        while(!stk.empty() && stk.top().second <= price){
            stk.pop();
        }      

        idx++;
        int ans = idx - stk.top().first;
        stk.emplace(idx, price);
        return ans;
    }
private:
    stack<pair<int,int>> stk;
    int idx;
};

/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner* obj = new StockSpanner();
 * int param_1 = obj->next(price);
 */

标签:901,int,price,stk,力扣,prices,StockSpanner,next,跨度
From: https://www.cnblogs.com/trmbh12/p/18198882

相关文章

  • 力扣-739. 每日温度
    1.题目题目地址(739.每日温度-力扣(LeetCode))https://leetcode.cn/problems/daily-temperatures/题目描述给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,......
  • 力扣-84. 柱状图中最大的矩形
    1.题目介绍题目地址(84.柱状图中最大的矩形-力扣(LeetCode))https://leetcode.cn/problems/largest-rectangle-in-histogram/题目描述给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示......
  • 力扣-96. 下一个更大元素 I
    1.题目题目地址(496.下一个更大元素I-力扣(LeetCode))https://leetcode.cn/problems/next-greater-element-i/题目描述nums1 中数字 x 的下一个更大元素是指 x 在 nums2中对应位置右侧的第一个比 x 大的元素。给你两个没有重复元素的数组 nums1和 nums......
  • 力扣224.基本计算器(困难)
    题目​ 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。解题思路我们可以使用两个栈nums和ops。nums:存放所有的数字ops:存放所有的数字以外的操作,+/-也看做是一种操作然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops......
  • 力扣第130场双周赛
    判断矩阵是否满足条件给定二维矩阵,判断所有格子是否满足如下条件:如果它下面的格子存在,那么它需要等于它下面的格子如果它右边的格子存在,那么它需要不等于它右边的格子遍历二维矩阵,简单模拟即可。classSolution{public:boolsatisfiesConditions(vector<vector<in......
  • 力扣1553 2024.5.13
    原题网址:此处为链接个人难度评价:1700分析:虽然不知道为什么贪心不对,但总之贪心不对。数据如此大也难以DP,那么只有搜索了。显然有一眼可得的搜索记忆化:记忆当只剩下k个果时还需要几天。值得一提的是,本代码实际上可能并不是一个正解代码,其可能无法在整数域上保证所有答案正确,但在......
  • 力扣-232. 用栈实现队列
    1.题目信息2.题解2.1双栈的使用(用栈实现队列)思路我们一开始可能会想到对于每次入栈操作——由于我们可能希望他是加在队尾(栈底)而不是队头(栈首),所以我们就进行一次首尾互换,将instack中的数据倒腾到outstack,由于栈先进后出的特性,所以这时候原来的栈底在头部,我们直接将元素pus......
  • 力扣刷题笔记-21 合并两个有序链表
    其实不回答就是答案双指针classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodedummy=newListNode(-1);ListNodep=dummy;ListNodep1=list1,p2=list2;while(p1!=null&&p2!=nu......
  • 力扣741 2024.5.6
    原题网址:https://leetcode.cn/problems/cherry-pickup/description/?envType=daily-question&envId=2024-05-06个人难度评价:1800分析:自然的想到分两次dp,第一次dp后修改格点值,然后进行第二次dp。这种做法是错误的:第一次dp的过程中,每次选择都对第二次dp产生后效性。明显从左上到......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......