不积跬步,无以至千里;不积小流,无以成江海
时间:2020-5-22 讨论:https://leetcode.cn/contest/weekly-contest-294 代码地址:
A: 字母在字符串中的百分比
思路:
关键点:
function percentageLetter(s: string, letter: string): number {
let count = 0;
let total = s.length;
for (let i of s) {
if (i === letter) count++;
}
return Math.floor(count / total * 100);
};
总结:
B: 装满石头的背包的最大数量
思路:
关键点:
- 求差值
- 排序
总结:function maximumBags(capacity: number[], rocks: number[], additionalRocks: number): number {
const n = capacity.length;
const diffs = capacity.map((c, i) => c - rocks[i]);
diffs.sort((a, b) => a - b);
let ans = 0;
for (let i = 0; i < n && (diffs[i] === 0 || diffs[i] <= additionalRocks); i++) {
ans++;
additionalRocks -= diffs[i];
}
return ans;
};
C: 表示一个折线图的最少线段数
思路:
关键点:
- 计算除法会导致浮点误差,改为乘法可以避免此问题
- BigInt实现大数运算
function minimumLines(stockPrices: number[][]): number {
const n = stockPrices.length;
stockPrices.sort((a, b) => a[0] - b[0]);
let ans = 0;
let pre = [BigInt(0), BigInt(0)];
for (let i = 1; i < n; i++) {
const [x1, y1] = stockPrices[i - 1];
const [x2, y2] = stockPrices[i];
const dx = BigInt(x2 - x1), dy = BigInt(y2 - y1);
if (i == 1 || (dx * pre[1] !== dy * pre[0])) ans++;
pre = [dx, dy];
}
return ans;
};
case: [[1,1],[500000000,499999999],[1000000000,999999998]]
错误📝:
D:巫师的总力量和
思路:
关键点:
- 单调栈
- 前缀和
练习
复盘
A 基础题
B 第一遍, 因为统计次数时操作数组导致超时。第二遍,针对性优化
C 未考虑到数据的边界
D 第一遍暴力超时, 单调栈、左右栈缺乏练习