不积跬步,无以至千里;不积小流,无以成江海
时间: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 规律题,有思路, 时间不够。 -> 动态规划
改进:
- 先实现再优化