力扣竞赛微爱思扣

186 阅读1分钟

这是我参与更文挑战的第21天,活动详情查看:更文挑战

LCS 01. 下载插件

截屏2021-06-22 下午8.24.18.png

思路分析

两种策略究竟选择什么,不妨去算算在什么情况下选择哪种情况是最优选择,

这道题比较善良,直接把边界条件写在了谜面上,设当前可下载插件的数量为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. 完成一半题目

截屏2021-06-22 下午8.55.17.png

思路分析

这道题题干说的不是很详细,输入的数组是个长度为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;
    }
   
};