首页 > [Swift]LeetCode901. 股票价格跨度 | Online Stock Span

[Swift]LeetCode901. 股票价格跨度 | Online Stock Span

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

➤微信公众号:山青咏芝(shanqingyongzhi)

➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)

➤GitHub地址:https://github.com/strengthen/LeetCode

➤原文地址: https://www.cnblogs.com/strengthen/p/10607919.html 

➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。

➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of that stock's price for the current day.

The span of the stock's price today is defined as the maximum number of consecutive days (starting from today and going backwards) for which the price of the stock was less than or equal to today's price.

For example, if the price of a stock over the next 7 days were [100, 80, 60, 70, 60, 75, 85], then the stock spans would be [1, 1, 1, 2, 1, 4, 6]

Example 1:

Input: ["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]
Output: [null,1,1,1,2,1,4,6]
Explanation: 
First, S = StockSpanner() is initialized.  Then:
S.next(100) is called and returns 1,
S.next(80) is called and returns 1,
S.next(60) is called and returns 1,
S.next(70) is called and returns 2,
S.next(60) is called and returns 1,
S.next(75) is called and returns 4,
S.next(85) is called and returns 6.Note that (for example) S.next(75) returned 4, because the last 4 prices
(including today's price of 75) were less than or equal to today's price. 

Note:

  1. Calls to StockSpanner.next(int price) will have 1 <= price <= 10^5.
  2. There will be at most 10000 calls to StockSpanner.next per test case.
  3. There will be at most 150000 calls to StockSpanner.next across all test cases.
  4. The total time limit for this problem has been reduced by 75% for C++, and 50% for all other languages.

编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。

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

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

示例:

输入:["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]
输出:[null,1,1,1,2,1,4,6]
解释:
首先,初始化 S = StockSpanner(),然后:
S.next(100) 被调用并返回 1,
S.next(80) 被调用并返回 1,
S.next(60) 被调用并返回 1,
S.next(70) 被调用并返回 2,
S.next(60) 被调用并返回 1,
S.next(75) 被调用并返回 4,
S.next(85) 被调用并返回 6。注意 (例如) S.next(75) 返回 4,因为截至今天的最后 4 个价格
(包括今天的价格 75) 小于或等于今天的价格。 

提示:

  1. 调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5
  2. 每个测试用例最多可以调用  10000 次 StockSpanner.next
  3. 在所有测试用例中,最多调用 150000 次 StockSpanner.next
  4. 此问题的总时间限制减少了 50%。

Runtime: 840 ms
Memory Usage: 23 MB
 1 class StockSpanner {
 2     var spans:[Int]
 3     var prices:[Int]
 4     var index:Int
 5 
 6     init() {
 7         spans = [Int](repeating:0,count:10_000)
 8         prices = [Int](repeating:0,count:10000)
 9         index = -1
10     }
11     
12     func next(_ price: Int) -> Int {
13         index += 1
14         prices[index] = price
15         if index == 0 || price < prices[index - 1]
16         {
17             spans[index] = 1
18             return 1
19         }
20         var previousIndex:Int = index - 1
21         var span:Int = 1
22         while (previousIndex >= 0 && price >= prices[previousIndex])
23         {
24             span += spans[previousIndex]
25             previousIndex -= spans[previousIndex]
26         }
27         spans[index] = span
28         return span
29     }
30 }
31 
32 /**
33  * Your StockSpanner object will be instantiated and called as such:
34  * let obj = StockSpanner()
35  * let ret_1: Int = obj.next(price)
36  */

892ms

 1 class StockSpanner {
 2 
 3     private var s = [(Int, Int)]()
 4     init() {
 5         
 6     }
 7     
 8     func next(_ price: Int) -> Int {
 9         var sum = 1
10         while !s.isEmpty, s.last!.0 <= price {
11             sum += s.removeLast().1
12         }
13         s.append((price, sum))
14         return sum
15     }
16 }

928ms

 1 class StockSpanner {
 2 
 3     init() {
 4         
 5     }
 6     
 7     struct PriceSpan {
 8         let price: Int
 9         let span: Int
10     }
11     
12     var stack = [PriceSpan]()
13     
14     func next(_ price: Int) -> Int {
15         guard stack.count > 0 else {
16             stack.append(PriceSpan(price: price, span: 1))
17             return 1
18         }
19         
20         var span = 1
21         while stack.last != nil && stack.last!.price <= price {
22             span += stack.last!.span
23             stack.removeLast()
24         }
25         
26         stack.append(PriceSpan(price: price, span: span))
27         return span
28     }
29 }
30 
31 /**
32  * Your StockSpanner object will be instantiated and called as such:
33  * let obj = StockSpanner()
34  * let ret_1: Int = obj.next(price)
35  */

1036ms

 1 class StockSpanner {
 2     private var span: [Int] = []
 3     private var stack: [StockSpan] = []
 4     init() {
 5         
 6     }
 7     
 8     func next(_ price: Int) -> Int {
 9         var stockSpan = StockSpan(price:price, span: 1)
10         while !stack.isEmpty && stack.last!.price <= stockSpan.price {
11             let removed = stack.removeLast()
12             stockSpan.span += removed.span
13         }
14         stack.append(stockSpan)
15         return stockSpan.span
16     }
17     
18     struct StockSpan {
19         let price: Int 
20         var span: Int
21     }
22 }
23 
24 /**
25  * Your StockSpanner object will be instantiated and called as such:
26  * let obj = StockSpanner()
27  * let ret_1: Int = obj.next(price)
28  */ 

 1 class StockSpanner {
 2     var prices: [Int] = []
 3     var days: [Int] = []
 4     init() {
 5         
 6     }
 7     
 8     func next(_ price: Int) -> Int {
 9         if prices.isEmpty || prices.last! > price {
10             prices.append(price)
11             days.append(1)
12             return 1
13         }
14         var index = prices.count - 1
15         var res = 1
16         while index >= 0 && prices[index] <= price {
17             res += days[index]
18             index -= days[index]
19         }
20         prices.append(price)
21         days.append(res)
22         return res
23     }
24 }
25 
26 /**
27  * Your StockSpanner object will be instantiated and called as such:
28  * let obj = StockSpanner()
29  * let ret_1: Int = obj.next(price)
30  */

 1 class StockSpanner {
 2     
 3     private var elements : [(price : Int, conquered : Int)] = []
 4     init() {
 5         
 6     }
 7     
 8     func next(_ price: Int) -> Int {
 9         var conquered : Int = 1
10         while !elements.isEmpty && elements.last!.price <= price {
11             let removed = elements.removeLast()
12             conquered += removed.conquered
13         }
14         
15         elements.append((price: price, conquered: conquered))
16         return elements.last!.conquered
17     }
18 }
19 
20 /**
21  * Your StockSpanner object will be instantiated and called as such:
22  * let obj = StockSpanner()
23  * let ret_1: Int = obj.next(price)
24  */

 

转载于:https://www.cnblogs.com/strengthen/p/10607919.html

更多相关:

  • #猜价钱 trueprice = 202 price = input("Please guess the price:") while (int(price) != trueprice):if(int(price) > trueprice):price = input("Your price is higher,Please try...

  • 第一篇博客 本文来自 自己老师 的博客 http://blog.csdn.net/lovelion/article/details/7818983 题目:某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:       (1) 学生凭学生证可享受票价8折优惠;     ...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...