这是我参与更文挑战的第21天,活动详情查看:更文挑战
LCS 01. 下载插件
思路分析
两种策略究竟选择什么,不妨去算算在什么情况下选择哪种情况是最优选择,
这道题比较善良,直接把边界条件写在了谜面上,设当前可下载插件的数量为x,那么当剩余待下载插件数量<2 * x时,则使用策略1比较合算,而如果剩余待下载插件数量大于2 * x时,则使用策略2比较合算。
恰好等于2*x便是边界条件,此时此刻选择两个策略都可以。
理论上可以使用递归实现上述逻辑,但大家已经不是一二年级的小孩子了,就直接使用while循环吧
代码
class Solution {
public:
int leastMinutes(int n) {
int tmp = 1;
int ret = 0;
while(n / tmp >= 2){
tmp = tmp * 2;
ret ++;
}
return n <= tmp ? 1 + ret : 2 + ret;
}
};
LCS 02. 完成一半题目
思路分析
这道题题干说的不是很详细,输入的数组是个长度为2*N(N是扣友数量)的数组,他的值是知识点类型,(共有1000种知识点类型,这个没写在题干里,写在了提示里面)。
相当于在求一个数组中众数的值(不是),不过差不多,只是众数变成了多个数,那么就需对数组进行统计,选出出现次数较多的知识点。
代码
如果使用map表进行存储的话,在数组较小的时候可以节省遍历次数,不过这里也不知道数据分布,没必要整这个活
class Solution {
public:
int halfQuestions(vector<int>& questions) {
int len = questions.size();
int n = len / 2;
int arr[1001];
for(int i = 0; i <= 1000; i++){
arr[i] = 0;
}
for(int i = 0; i < len; i++){
arr[questions[i]] ++;
}
int arr1[1001];
for(int i = 0; i <= 1000; i++) arr1[i] = i;
sort(arr1, arr1+ 1001, [=](int a, int b){return arr[a] > arr[b];});
int i = 0;
while(n > 0){
n -= arr[arr1[i]];
i++;
}
return i;
}
};