第一題,很簡單,其實就是求不一樣元素的個數面試
某互聯網公司一年一度的春招開始了,一共有 n
名面試者入選。每名面試者都會提交一份簡歷,公司會根據提供的簡歷資料產生一個預估的能力值,數值越大表明越有可能經過面試。spa
小 A 和小 B 負責審覈面試者,他們均有全部面試者的簡歷,而且將各自根據面試者能力值從大到小的順序瀏覽。因爲簡歷事先被打亂過,能力值相同的簡歷的出現順序是從它們的全排列中等可能地取一個。如今給定 n
名面試者的能力值 scores
,設 X
表明小 A 和小 B 的瀏覽順序中出如今同一位置的簡歷數,求 X
的指望。code
提示:離散的非負隨機變量的指望計算公式爲 。在本題中,因爲
X
的取值爲 0 到 n
之間,指望計算公式能夠是 。blog
示例 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
道題,編號從 0
到 n-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個人水平就到這裏了哈哈哈哈(暫時)