5.2 三题
690.员工的重要性
广搜 map queue / 深搜 并查集
https://leetcode-cn.com/problems/employee-importance/
没啥好说的搜就完事了
554.砖墙
思维 map
https://leetcode-cn.com/problems/brick-wall/
转化为如图的问题 小竖线即为边缘 找出竖线最多的那一列即走边缘最多的那条路
剑指 Offer 04 二维数组中的查找
思维
https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
- 从右上或者左下出发 此时target小于或者大于当前数都有唯一的方向可以走
- 为什么这么操作一定可以找到呢 因为每一步排除的都是必不可能==target的
- 如果target不存在 是能排除掉所有元素的 因此一定能找到
- 时间复杂度最复杂也就是长+宽
5.3 三题
同题水了一题
7. 整数反转
数据类型 数学
https://leetcode-cn.com/problems/reverse-integer/
int -2147483648 - 2147483647
重点在32位int uint的范围内完成是否越界的判断
解法一 数据类型强行判断
- 不给用long我们还有unsigned 也就是int最大的两倍
- 为什么要用unsigned呢 因为要靠第一位大小判断 如果用int 大了又存不下 差不多时要判断每一位很麻烦 记录正负后用个unsigned记下除去符号的值 可以直接用> <了
- 由于记录除去符号值时 负数比正数多一个 所以 unsigned = 0 - int的右边会临时爆int 所以把-2147473648特判一下
- 用栈把x反转成字符串再atoi(str.c_str)变成数字sans
- 如果这个sans长度大于10肯定爆了int 返回0 如果首位>=3也肯定爆了 返回0
- 这题明显不该这么做 但我还是作死了
解法二 数学
MaxInt = 2147483647
MinInt = -2147483648
int reverse(int x) {
int rev = 0;
while (x != 0) {
if (rev < MinInt/10 || rev > MaxInt/10) {
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
目标 将 M i n I n t < = r e v ∗ 10 + d i g i t < = M a x I n t MinInt <= rev*10+ digit <= MaxInt MinInt<=rev∗10+digit<=MaxInt这个判断放到int范围内进行
- 考虑正数
- 即考虑 r e v ∗ 10 + d i g i t < = M a x I n t rev*10+digit<=MaxInt rev∗10+digit<=MaxInt这个不等式
- M a x I n t = ⌊ M a x I n t 10 ⌋ ∗ 10 + 7 MaxInt = \left\lfloor\dfrac{MaxInt}{10}\right\rfloor*10+7 MaxInt=⌊10MaxInt⌋∗10+7
- 这么做是为了弄出个 ∗ 10 *10 ∗10方便减小数据量
- 原式 => r e v ∗ 10 + d i g i t < = ⌊ M a x I n t 10 ⌋ ∗ 10 + 7 rev*10+digit<=\left\lfloor\dfrac{MaxInt}{10}\right\rfloor*10+7 rev∗10+digit<=⌊10MaxInt⌋∗10+7
- ( r e v − ⌊ M a x I n t 10 ⌋ ) ∗ 10 < = 7 − d i g i t \color{Pink}(rev-\left\lfloor\dfrac{MaxInt}{10}\right\rfloor)*10<=7-digit (rev−⌊10MaxInt⌋)∗10<=7−digit
- 考虑上述不等式
-
若 r e v > ⌊ M a x I n t 10 ⌋ rev>\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev>⌊10MaxInt⌋
- 则左边至少10 右边小于7
- 不等式不成立 return 0;
-
若 r e v = ⌊ M a x I n t 10 ⌋ rev=\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev=⌊10MaxInt⌋
- 当且仅当digit<=7时成立
- 同时 当 r e v = ⌊ M a x I n t 10 ⌋ rev=\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev=⌊10MaxInt⌋时 由于 x < = M a x I n t x<=MaxInt x<=MaxInt(题设) 且此时经历了上一轮的x还能进循环 那么x一定与MaxInt位数相同且本次循环所取的是最高位且必为1or2
- 不等式成立
-
若 r e v < ⌊ M a x I n t 10 ⌋ rev<\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev<⌊10MaxInt⌋
- 左边最大-10 右边最小-2
- 不等式成立
-
- 综上 不等式在 r e v < = ⌊ M a x I n t 10 ⌋ rev<=\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev<=⌊10MaxInt⌋时成立 , r e v > ⌊ M a x I n t 10 ⌋ rev>\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev>⌊10MaxInt⌋ 时return 0
- 考虑负数
- 与正数相同
剑指 Offer 15. 二进制中1的个数
bitset 位
https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/comments/
迷惑