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);
}
}
};