不积跬步,无以至千里;不积小流,无以成江海

时间:2020-5-22 讨论:https://leetcode.cn/contest/weekly-contest-294 代码地址:

A: 字母在字符串中的百分比

思路:
关键点:

  1. function percentageLetter(s: string, letter: string): number {
  2. let count = 0;
  3. let total = s.length;
  4. for (let i of s) {
  5. if (i === letter) count++;
  6. }
  7. return Math.floor(count / total * 100);
  8. };

总结:

B: 装满石头的背包的最大数量

思路:
关键点:

  1. 求差值
  2. 排序
    1. function maximumBags(capacity: number[], rocks: number[], additionalRocks: number): number {
    2. const n = capacity.length;
    3. const diffs = capacity.map((c, i) => c - rocks[i]);
    4. diffs.sort((a, b) => a - b);
    5. let ans = 0;
    6. for (let i = 0; i < n && (diffs[i] === 0 || diffs[i] <= additionalRocks); i++) {
    7. ans++;
    8. additionalRocks -= diffs[i];
    9. }
    10. return ans;
    11. };
    总结:

C: 表示一个折线图的最少线段数

思路:
关键点:

  1. 计算除法会导致浮点误差,改为乘法可以避免此问题
  2. BigInt实现大数运算
    1. function minimumLines(stockPrices: number[][]): number {
    2. const n = stockPrices.length;
    3. stockPrices.sort((a, b) => a[0] - b[0]);
    4. let ans = 0;
    5. let pre = [BigInt(0), BigInt(0)];
    6. for (let i = 1; i < n; i++) {
    7. const [x1, y1] = stockPrices[i - 1];
    8. const [x2, y2] = stockPrices[i];
    9. const dx = BigInt(x2 - x1), dy = BigInt(y2 - y1);
    10. if (i == 1 || (dx * pre[1] !== dy * pre[0])) ans++;
    11. pre = [dx, dy];
    12. }
    13. return ans;
    14. };

case: [[1,1],[500000000,499999999],[1000000000,999999998]]

错误📝:

截屏2022-05-22 上午11.29.33.png

D:巫师的总力量和

思路:
关键点:

  1. 单调栈
  2. 前缀和

错误📝:超时
截屏2022-05-22 下午4.11.56.png

练习

单调栈
左右栈

复盘

截屏2022-05-22 下午12.02.29.png
A 基础题
B 第一遍, 因为统计次数时操作数组导致超时。第二遍,针对性优化
C 未考虑到数据的边界
D 第一遍暴力超时, 单调栈、左右栈缺乏练习