LeetCode题解之需要trick的题(二)

369 阅读1分钟

621. 任务调度器

这个题解说的很清晰~

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        int len = tasks.size();//总任务数量
        vector<int> vec(26);
        for(char c: tasks) vec[c - 'A'] ++;
        sort(vec.begin(), vec.end(), [](int& x, int& y){ return x > y;});//对vec按照从大到小排序
        int cnt = 1;
        while(cnt < vec.size() && vec[cnt] == vec[0]) cnt ++;//从第二多的数看是不是有和第一多的数相等的,有的话后面最后一排需要单独加
        return max(len, cnt + (n + 1) * (vec[0] - 1));//
    }
};

581. 最短无序连续子数组

本题除了排序还有别的优化的方法~

class Solution {
public:
/*
排序的做法:将数组 nums 进行排序,记为nums_sorted。然后我们比较nums 和 nums_sorted 的元素来决定最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组
*/
    int findUnsortedSubarray(vector<int>& nums) {
        vector<int> nums2 = nums;
        sort(nums2.begin(), nums2.end());
        int start = nums2.size(), end = 0;
        for(int i = 0; i < nums2.size(); i ++)
        {
            if(nums2[i] != nums[i]) 
            {
                start = min(start, i);
                end = max(end, i);
            }
        }
        return (end - start > 0 ? end - start + 1 : 0);
    }
};

560. 和为K的子数组

class Solution {
/*
较为暴力的做法:枚举终点,起点从终点开始往前挪动
*/
public:
    int subarraySum(vector<int>& nums, int k) {
        int count = 0;
        for(int end = 0; end < nums.size(); end ++)
        {
            int sum = 0;
            for(int start = end; start >=0; start --)
            {
                sum += nums[start];
                if(sum == k) count ++;
            }
        }
        return count;
    }
};

494. 目标和

class Solution {
public:
/*
朴素的dfs做法,还有dp做法
*/
    int count = 0;
    int findTargetSumWays(vector<int>& nums, int S) {
        calculate(nums, 0, 0, S);
        return count;
    }
    void calculate(vector<int>& nums, int i, int sum, int S)
    {
        if(i == nums.size())  
            {
                if(sum == S)
                count ++;
            }
        else
        {
            calculate(nums, i + 1, sum + nums[i], S);
            calculate(nums, i + 1, sum - nums[i], S);
        }
    }
};