2020.4.25 leetcode 編程戰隊賽

第一題,很簡單,其實就是求不一樣元素的個數面試

 

某互聯網公司一年一度的春招開始了,一共有 n 名面試者入選。每名面試者都會提交一份簡歷,公司會根據提供的簡歷資料產生一個預估的能力值,數值越大表明越有可能經過面試。spa

小 A 和小 B 負責審覈面試者,他們均有全部面試者的簡歷,而且將各自根據面試者能力值從大到小的順序瀏覽。因爲簡歷事先被打亂過,能力值相同的簡歷的出現順序是從它們的全排列中等可能地取一個。如今給定 n 名面試者的能力值 scores,設 X 表明小 A 和小 B 的瀏覽順序中出如今同一位置的簡歷數,求 X 的指望。code

提示:離散的非負隨機變量的指望計算公式爲 1。在本題中,因爲 X 的取值爲 0 到 n 之間,指望計算公式能夠是 2blog

示例 1:class

輸入:scores = [1,2,3]變量

輸出:3互聯網

解釋:因爲面試者能力值互不相同,小 A 和小 B 的瀏覽順序必定是相同的。X的指望是 3 。循環

示例 2:簡歷

輸入:scores = [1,1]im

輸出:1

解釋:設兩位面試者的編號爲 0, 1。因爲他們的能力值都是 1,小 A 和小 B 的瀏覽順序都爲從全排列 [[0,1],[1,0]] 中等可能地取一個。若是小 A 和小 B 的瀏覽順序都是 [0,1] 或者 [1,0] ,那麼出如今同一位置的簡歷數爲 2 ,不然是 0 。因此 X 的指望是 (2+0+2+0) * 1/4 = 1

示例 3:

輸入:scores = [1,1,2]

輸出:2

限制:

  • 1 <= scores.length <= 10^5
  • 0 <= scores[i] <= 10^6
int expectNumber(vector<int>& scores) {
        sort(scores.begin(),scores.end());
        int cnt=1;
        for(int i=1;i<scores.size();i++){
            if(scores[i]!=scores[i-1])cnt++;
        }
        return cnt;
    }

 

第二題,我最開始用dp作,實際上是能夠作出來的,只不過三層循環超時妥妥的,,看了大佬的解法後才知道原來是二分最大天數,妙啊。。

 

爲了提升本身的代碼能力,小張制定了 LeetCode 刷題計劃,他選中了 LeetCode 題庫中的 n 道題,編號從 0n-1,並計劃在 m 天內按照題目編號順序刷完全部的題目(注意,小張不能用多天完成同一題)。

在小張刷題計劃中,小張須要用 time[i] 的時間完成編號 i 的題目。此外,小張還可使用場外求助功能,經過詢問他的好朋友小楊題目的解法,能夠省去該題的作題時間。爲了防止「小張刷題計劃」變成「小楊刷題計劃」,小張天天最多使用一次求助。

咱們定義 m 天中作題時間最多的一天耗時爲 T(小楊完成的題目不計入作題總時間)。請你幫小張求出最小的 T是多少。

示例 1:

輸入:time = [1,2,3,3], m = 2

輸出:3

解釋:第一天小張完成前三題,其中第三題找小楊幫忙;次日完成第四題,而且找小楊幫忙。這樣作題時間最多的一天花費了 3 的時間,而且這個值是最小的。

示例 2:

輸入:time = [999,999,999], m = 4

輸出:0

解釋:在前三天中,小張天天求助小楊一次,這樣他能夠在三天內完成全部的題目並不花任什麼時候間。

 

限制:

  • 1 <= time.length <= 10^5
  • 1 <= time[i] <= 10000
  • 1 <= m <= 1000
 bool satisfy(vector<int>& time, int m, int maxT){
        int sum=0;
        int maxtime=0;
        int day=0;
        for(int i=0;i<time.size();i++){
            maxtime=max(time[i],maxtime);
            sum+=time[i];
            if(sum-maxtime>maxT){
                if(++day==m)return false;
                sum=time[i];
                maxtime=time[i];
            }
        }
        return true;
    }
    int minTime(vector<int>& time, int m) {
        if(time.size()<=m)return 0;
        int sum=0;
        for(int i=0;i<time.size();i++){
            sum+=time[i];
        }
        int l=0,r=INT_MAX;
        while(l<r){
            int mid=(l+r)/2;
            if(!satisfy(time,m,mid))l=mid+1;
            else
                r=mid;
        }
        return l;
    }

第三題,,dbq個人水平就到這裏了哈哈哈哈(暫時)

相關文章
相關標籤/搜索