题型总结——leetcode 2860 让所有学生保持开心的分组方法数
2860. 让所有学生保持开心的分组方法数解法1234567891011121314151617181920212223242526 int DpTopic::countWays(vector<int>& nums){ //排序,枚举 // 将原有的内容降序排列 ranges::sort(nums, greater<int>()); int n = nums.size() - 1; //默认选择所有的元素 int res = 1; for (int i = 1; i < nums.size(); ++i) { if (nums[i] < n && nums[i - 1] > n) { ++res; } --n; } //最小的元素不是0的情况下,才能所有元素全都不选取还符合条件 if (nums.back() != 0) { ++res; } return res;}
题型总结——leetcode 2708. 一个小组的最大实力值
2708. 一个小组的最大实力值贪心算法1234567891011121314151617//很多地方都很常规,就是需要额外注意一下跟自身大小的比较 long long DpTopic::maxStrength(vector<int>& nums) { long long minVal = nums[0], maxVal = nums[0]; long long val1 = 0, val2 = 0; nums.erase(nums.begin()); for (long long x : nums) { val1 = minVal * x; val2 = maxVal * x; minVal = min({ minVal, val1,val2,x }); maxVal = max({ maxVal,val1,val2,x }); } return maxVal; }
题型总结——leetcode 2024 考试的最大困扰度
2024. 考试的最大困扰度解法滑动窗口,滑动窗口的重点是左右指针变动的时机,这道题目存在两种解法,一种是将T和F的筛选分开,在代码段中使用两个while循环体进行操作
双while循环体1234567891011121314151617181920212223242526272829303132333435363738int Topic::maxConsecutiveAnswers(std::string answerKey, int k) { int maxT = 0, maxF = 0; // 处理 'T' 的最长连续序列 int leftT = 0, rightT = 0; int flipsT = 0; while (rightT < answerKey.length()) { if (answerKey[rightT] == 'F') { ++flipsT; } while (flipsT > k) { ...
题型总结——leetcode 1493 删除一个元素后全为1的最长子数组
1493. 删掉一个元素以后全为 1 的最长子数组解法滑动窗口123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 //核心是 每一次都已遇见0都会默认删除,记录遇见的0的数量, 当滑动窗口内的0数量超过一个,,就会去缩减左边界,抛弃掉上一次删除的0就可以对新加入的0进行 删除操作,非常巧妙 000111011110111111,int ans = 0, n = nums.size(); // cnt数组记录区间[j, i]中0和1的数量 int cnt[2] = {0}; for(int i = 0, j = 0; i < n; ++i) { cnt[nums[i]]++; // 缩小左端点j while(cnt[0] > 1) cnt[nums[j++]]--; // 必须删除一 ...