JZX 轻语

挖掘时光的细节

LeetCode 1653 - 使字符串平衡的最少删除次数

Flash 此文章属于Flash闪念部分的短文
从左到右枚举所有的“分割点”,计算在该点处为了达成“左侧全是'a'、右侧全是'b'”的状态所需要删除的字符总数(即:左侧的'b'数量 + 右侧的'a'数量),求最小值即可。需要两次遍历:第一次遍历统计整个字符串中两个字符的数量;第二次遍历用于维护左(左侧已遍历的字符数量,可以计算右侧的字符数量)枚举右(分割点)。 class Solution { public: int min...

LeetCode 3634 - 使数组平衡的最少移除数目

Flash 此文章属于Flash闪念部分的短文
核心思路是利用排序+滑动窗口(双指针)来寻找满足条件的最长子数组。既然我们要删除最少的元素,反过来想,就是要在原数组中保留尽可能多的元素,使它们组成一个“平衡”的数组。由于“平衡”数组的判定条件只看最小值和最大值的大小关系,因此可以先将原来的数组进行排序,然后使用滑动窗口不断枚举(并固定)左边界、扩展右边界以计算所能形成的满足条件的最长子数组,最后取最大值,计算和数组总长的差值即可。 ...

LeetCode 3315 & 3316 - 构造最小位运算数组

Flash 此文章属于Flash闪念部分的短文
位运算的题目,数组nums的元素为质数并没有太多特殊的含义,只是告诉你除了2之外,其他必然为奇数(也就是二进制表示法中,必定以1比特位结尾)。对于给出的条件ans[i] OR (ans[i] + 1),不难想到对于任意整数x,x OR (x + 1)的效果是将x从右往左数遇到的第一个二进制0变为1(比如,对于a = 111000011,那么a + 1 = 111000100,a OR a +...

LeetCode 2962 - 统计最大元素出现至少 K 次的子数组

Flash 此文章属于Flash闪念部分的短文
滑动窗口的套路题目,窗口左侧每移动一位,右侧移到刚好满足条件,然后右侧后面所有的子数组都能满足条件,简单来说做法就是在每次(外层)循环中: 窗口左侧指针left向右移动一位; 窗口右侧指针right向右移动,直到窗口满足条件,此时所有以left为左端点、right直到n为右端点的子数组都满足条件; class Solution { publ...

LeetCode 2799 - 统计完全子数组的数目

Flash 此文章属于Flash闪念部分的短文
同样是滑动窗口的套路题目,窗口左侧每移动一位,右侧移到刚好满足条件,然后右侧后面所有的子数组都能满足条件。具体思路可以参考2962题。 class Solution { public: int countCompleteSubarrays(vector<int>& nums) { int ans {0}; unordered_...

LeetCode 2873&2874 - 有序三元组中的最大值 II

Flash 此文章属于Flash闪念部分的短文
比较套路的题目,我们可以使用两个变量来分别维护已枚举的前缀中的最大值和当前的最大差值。我们从左到右遍历数组,更新这两个变量,并在每次迭代中计算当前的最优解。最终返回结果即可。 class Solution { public: long long maximumTripletValue(vector<int>& nums) { long lon...

LeetCode 2716 - 最小化字符串长度

Flash 此文章属于Flash闪念部分的短文
挺简单的题目,按题目的操作,字符串中所出现的每个字母最终都会减少到1个,所以我们只需要统计字符串中不同字母的数量即可。 class Solution { public: int minimizedStringLength(string s) { vector<int> cnt_map(26, 0); for (const auto&a...

LeetCode 2140 - 解决智力问题

Flash 此文章属于Flash闪念部分的短文
动态规划题目,我们可以使用一个一维数组dp来记录从当前题目开始到最后一题的最大分数。从后往前遍历,对于每个题目,有两种选择:选择当前题目或者跳过当前题目。我们需要根据题目的分数和脑力消耗来更新dp数组。最终返回dp[0]即可。 不考虑边界条件的情况下,状态转移方程为:dp[i] = max(dp[i + 1], questions[i][0] + dp[i + questions[i][1...

LeetCode 2109 - 向字符串添加空格

Flash 此文章属于Flash闪念部分的短文
使用两个指针维护当前字符串s的索引和空格数组spaces的索引。我们从左到右遍历字符串s,如果当前s的索引等于空格数组中索引指向的位置,则在结果字符串中添加一个空格,并将空格数组的索引加一(往右移动到下一个需要加空格的地方)。按需处理完空格后,将当前字符添加到结果字符串中。最终返回结果字符串即可。 class Solution { public: string addSpace...

LeetCode 1863 - 找出所有子集的异或总和再求和

Flash 此文章属于Flash闪念部分的短文
简单的回溯模板题,在backtrace函数中,我们需要遍历所有可能的子集,并计算它们的异或和。我们可以通过递归来实现这个过程,每次递归时,我们有两个选择:选择当前元素或者不选择当前元素。最终,我们将所有子集的异或和相加,得到结果。 class Solution { public: int result {0}; vector<int> nums; i...