不积跬步,无以至千里;不积小流,无以成江海
时间:2020-5-1 花费: 1.5 + 2h 讨论:https://leetcode-cn.com/circle/discuss/nf6j8j/ 代码地址:
A: 移除指定数字得到的最大结果
思路:贪心
关键点:贪心
function removeDigit(number: string, digit: string): string {let nums = number.split('');const n = nums.length;let ans = 0;for (let i = 0; i < n; i++) {if (nums[i] != digit) continue;ans = i;if ((i + 1 < n) && (nums[i + 1] > nums[i])) break;}// console.log(ans)nums.splice(ans, 1);return nums.join('');};
贪心法练习:
402. 移掉K位数字
1881. 插入后的最大值
B: 必须拿起的最小连续卡牌数
思路:哈希表
关键点:哈希表
function minimumCardPickup(cards: number[]): number {const n = cards.length;let hashMap = new Map<number, number>();const max = Number.MAX_SAFE_INTEGER;let ans = max;for (let i = 0; i < n; i++) {let num = cards[i];if (hashMap.has(num)) {ans = Math.min(i - hashMap.get(num) + 1, ans);}hashMap.set(num, i);}return ans == max ? -1 : ans;};
总结:无
C: 含最多 K 个可整除元素的子数组
思路:滑动窗口
关键点:
- 滑动窗口
- 借助子数组转字符串去重
- 注意,滑动窗口的边界是第k+1个可以被整除的元素之前
总结:function countDistinct(nums: number[], k: number, p: number): number {const n = nums.length;const numSet = new Set(nums);const verfiedSet = new Set<number>();for (let i of numSet) {if (i % p != 0) continue;verfiedSet.add(i);}let ans = new Set<string>();for (let i = 0; i < n; i++) {let sub = [];for (let j = i, cnt = 0; j < n; j++) {const num = nums[j];if (verfiedSet.has(num)) cnt++;if (cnt > k) break;sub.push(num);const str = sub.join(',');ans.add(str);}}// console.log(ans);return ans.size;};
D: 字符串的总引力
思路:动态规划
关键点:动态规划
function appealSum(s: string): number {
const n = s.length;
let dp = new Array(n + 1).fill(0);
dp[0] = 0;
const hashMap = new Map();
for (let i = 0; i < n; i++) {
const c = s.charAt(i);
dp[i + 1] = dp[i] + i + 1 - (hashMap.get(c) || 0);
hashMap.set(c, i + 1);
}
return dp.reduce((a, c) => a + c, 0);
};
总结: :::info 类似题:
- 828. 统计子串中的唯一字符
- 907. 子数组的最小值之和
- 1498. 满足条件的子序列数目
- 2104. 子数组范围和
:::
复盘

A 错误两次,第一次返回数据类型错误,第二次字符串转数字长度溢出。推测采用贪心, 未找到规律。 -> 贪心
B 通过,使用codeAI导致几处细节修改不彻底导致耗时叫超长。 -> 关闭codeAI
C 错误两次, 滑动窗口尾部不正确导致耗时较长,通过后比赛已结束。
D 规律题,有思路, 时间不够。 -> 动态规划
改进:
- 先实现再优化
