国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

901-股票價格跨度

用戶83 / 787人閱讀

摘要:前言的第二道題目,同樣是分值分且中等難度的題目股票價格跨度編寫一個類,它收集某些股票的每日報價,并返回該股票當日價格的跨度。第二版股票價格跨度存儲一個遞增數列的實體最低位最高位在當前股價區間內最高位大于當前股價,生成一個新的

前言

Weekly Contest 101的第二道題目,同樣是分值4分且中等難度的題目股票價格跨度:

編寫一個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) 小于或等于今天的價格。

提示:

調用StockSpanner.next(int price) 時,將有1 <= price <= 10^5

每個測試用例最多可以調用10000StockSpanner.next

在所有測試用例中,最多調用150000StockSpanner.next

此問題的總時間限制減少了50%

解題思路

這道題目其實如果只是實現題目的功能要求的話是一道很簡單的題目。只是不斷獲取一個數組從最后一個元素開始單調遞增數列的長度。

但是有由于在提示內容中已經提到了執行時間限制的問題,就可以知道這個題目需要進行執行時間相關方面的優化。最終我決定使用的優化方案是參考跳表這種數據結構,利用空間換取時間。思路大致如下,詳細內容可以參考實現代碼的第二版:

定義一個存儲遞增數列的實體StockPrices,該實體還會記錄最高位(第一個元素)和最低位(最后一個元素)

StockSpanner中存儲的是StockPrices的數組

每當有新股價進入,逆序(從最后一個元素開始)遍歷StockSpannerStockPrices數組。然后根據是否在當前的遞增數列的范圍進行處理。

以示例作為例子:
初始化后

pricesList:[
    {
        left:0
        right:0
        prices:[]
    }

next(100)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    }
return 1

next(80)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    }]
return 1

next(60)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    }
    {
        left:60
        right:60
        prices:[60]
    }]
    
return 1  

next(70)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    },
    {
        left:60
        right:70
        prices:[60,70]
    }]
    
return 2 

next(60)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    },
    {
        left:60
        right:70
        prices:[60,70]
    },
    {
        left:60
        right:60
        prices:[60]
    }]
   
return 1 

next(75)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    },
    {
        left:60
        right:70
        prices:[60,70]
    },
    {
        left:60
        right:75
        prices:[60,75]
    }]
   
return 4 

next(85)

pricesList:[
    {
        left:100
        right:100
        prices:[100]
    },
    {
        left:80
        right:80
        prices:[80]
    },
    {
        left:60
        right:70
        prices:[60,70]
    },
    {
        left:60
        right:85
        prices:[60,75,85]
    }]
   
return 6
實現代碼 第一版

這個版本是只實現功能的版本,所以提交上去基本都是執行超時的結果。但是可以作為第二版的參考。

class StockSpanner {

    private List prices;

    public StockSpanner() {
        prices=new ArrayList();
    }

    public int next(int price) {
        int result=1;
        prices.add(price);
        int days=prices.size();
        if(days>1){
            int todayPrice=price;
            for(int i=days-2;i>=0;i--){
                if(todayPrice>=prices.get(i)){
                    ++result;
                }else{
                    break;
                }
            }
        }
        return result;
    }
}
第二版
/**
 * 股票價格跨度
 * @author RJH
 * create at 2018/9/9
 */
public class StockSpanner {

    private List pricesList;

    /**
     * 存儲一個遞增數列的實體
     */
    class StockPrices{
        /**
         * 最低位
         */
        int left;
        /**
         * 最高位
         */
        int right;
        /**
         *
         */
        List prices=new ArrayList<>();
    }


    public StockSpanner() {
        pricesList=new ArrayList<>();
        StockPrices stockPrices=new StockPrices();
        pricesList.add(stockPrices);
    }

    public int next(int price) {
        int result=0;
        StockPrices stockPrices=pricesList.get(pricesList.size()-1);
        List prices=stockPrices.prices;
        if(prices.size()==0){
            stockPrices.left=price;
            stockPrices.right=price;
            prices.add(price);
            result+=prices.size();
            return result;
        }
        if(stockPrices.right<=price){//在當前股價區間內
            prices.add(price);
            stockPrices.right=price;
            result+=prices.size();
        }else{//最高位大于當前股價,生成一個新的StockPrices
            StockPrices newStockPrices=new StockPrices();
            newStockPrices.prices=new ArrayList<>();
            newStockPrices.prices.add(price);
            newStockPrices.left=price;
            newStockPrices.right=price;
            result+=newStockPrices.prices.size();
            pricesList.add(newStockPrices);
        }
        for(int i=pricesList.size()-2;i>=0;i--){
            StockPrices sp=pricesList.get(i);
            if(sp.right>price){
                break;
            }else if(sp.left>price){
                for(int j=sp.prices.size()-1;j>=0;j--){
                    if(price<=sp.prices.get(j)){
                        ++result;
                    }
                }
            }else if(sp.left<=price){
                result+=sp.prices.size();
            }
        }
        return result;
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77053.html

相關文章

  • [Leetcode] Best Time to Buy and Sell Stock 買賣股票的最佳

    摘要:雙指針法復雜度時間空間思路根據買賣股票的特性,我們必須先低價買,再高價賣,這個找最大收益的過程實際上是找到目前為之的最低價。我們可以利用這個之前計算的結果降低時間復雜度不過代價是額外空間,所以需要把到的最大收益存在數組中。 Best Time to Buy and Sell Stock I Say you have an array for which the ith element...

    nanchen2251 評論0 收藏0
  • 【刷算法】LeetCode.150-買賣股票的最佳時機 II

    摘要:題目描述給定一個數組,它的第個元素是一支給定股票第天的價格。設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易多次買賣一支股票。隨后,在第天股票價格的時候買入,在第天股票價格的時候賣出這筆交易所能獲得利潤。 題目描述 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票...

    Vultr 評論0 收藏0
  • 【LeetCode】貪心算法--買賣股票的最佳時機 II(122)

    摘要:貪心算法每一步必須滿足一下條件可行的即它必須滿足問題的約束。四題目分析貪心算法,總是做出在當前看來是最好的選擇,不從整體最優上加以考慮,也就是說,只關心當前最優解,按照貪心策略,不關心以后,我們只關心當前利益。 一、寫在前面 為什么要在LeetCode刷題?大家都知道不管是校招還是社招算法題是必考題,而這一部分恰巧是大多數人的短板,所以刷題首先是為了提高自身的編程能力,能夠在算法面試中...

    xbynet 評論0 收藏0
  • 金融套利策略:理解統計套利的工作原理

    摘要:后一種方法被稱之為多因子統計套利模型。套利套利可以被稱為交叉資產套利的一種形式,它可以識別的價值與其相關資產之間的差異。目前,統計套利策略已經成為了對沖基金和投資銀行的主要力量。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/ea2... 1. 什么是定量交易 定量交易是通過統計技術(或...

    whataa 評論0 收藏0
  • AJAX應用【股票案例、驗證碼校驗】

    摘要:當然了,和具體股票對象應該是全局的變量這樣才能夠在別的方法中用到二驗證碼校驗對于驗證碼檢查我們并不會陌生,我們在學習的時候已經使用過了驗證碼檢查了。 一、股票案例 我們要做的是股票的案例,它能夠無刷新地更新股票的數據。當鼠標移動到具體的股票中,它會顯示具體的信息。 我們首先來看一下要做出來的效果: showImg(https://segmentfault.com/img/remote/...

    阿羅 評論0 收藏0

發表評論

0條評論

用戶83

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<