第一题,很简单,其实就是求不同元素的个数
某互联网公司一年一度的春招开始了,一共有 n
名面试者入选。每名面试者都会提交一份简历,公司会根据提供的简历资料产生一个预估的能力值,数值越大代表越有可能通过面试。
小 A 和小 B 负责审核面试者,他们均有所有面试者的简历,并且将各自根据面试者能力值从大到小的顺序浏览。由于简历事先被打乱过,能力值相同的简历的出现顺序是从它们的全排列中等可能地取一个。现在给定 n
名面试者的能力值 scores
,设 X
代表小 A 和小 B 的浏览顺序中出现在同一位置的简历数,求 X
的期望。
提示:离散的非负随机变量的期望计算公式为 。在本题中,由于 X
的取值为 0 到 n
之间,期望计算公式可以是 。
示例 1:
输入:
scores = [1,2,3]
输出:
3
解释:由于面试者能力值互不相同,小 A 和小 B 的浏览顺序一定是相同的。
X
的期望是 3 。
示例 2:
输入:
scores = [1,1]
输出:
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我的水平就到这里了哈哈哈哈(暂时)