🗒️2379. 得到 K 个黑块的最少涂色次数
2024-11-22
| 2024-11-22
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Nov 22, 2024 02:11 AM
给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。
给你一个整数 k ,表示想要 连续 黑色块的数目。
每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。

大写字母 "W" 和 "B" 的 ASCII 码分别是 87 和 66。它们的二进制表示如下:
  • 大写字母 "W": 01010111
  • 大写字母 "B": 01000010
他们的最后一位不相同,可以进行判别
问:为什么把 if-else(或者 ?: 三目运算符)写成 s[i] & 1 就会快很多?(本题数据范围小看不出区别)
答:CPU 在遇到分支(条件跳转指令)时会预测代码要执行哪个分支,如果预测正确,CPU 就会继续按照预测的路径执行程序。但如果预测失败,CPU 就需要回滚之前的指令并加载正确的指令,以确保程序执行的正确性。
对于本题的数据,字符 ‘W’ 和 ‘B’ 可以认为是随机出现的,在这种情况下分支预测就会有 50% 的概率失败。失败导致的回滚和加载操作需要消耗额外的 CPU 周期,如果能用较小的代价去掉分支,对于本题的情况必然可以带来效率上的提升。
注意:这种优化方法往往会降低可读性,最好不要在业务代码中使用。

📎 参考

 
  • 【题单】滑动窗口与双指针
  • 1052. 爱生气的书店老板2090. 半径为 k 的子数组平均值
    Loading...
    目录