每日3题

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<=rev10+digit<=MaxInt这个判断放到int范围内进行

  1. 考虑正数
    • 即考虑 r e v ∗ 10 + d i g i t < = M a x I n t rev*10+digit<=MaxInt rev10+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=10MaxInt10+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 rev10+digit<=10MaxInt10+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 (rev10MaxInt)10<=7digit
    • 考虑上述不等式
      1. r e v > ⌊ M a x I n t 10 ⌋ rev>\left\lfloor\dfrac{MaxInt}{10}\right\rfloor rev>10MaxInt

        • 则左边至少10 右边小于7
        • 不等式不成立 return 0;
      2. 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
        • 不等式成立
      3. 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
  2. 考虑负数
    • 与正数相同

剑指 Offer 15. 二进制中1的个数

bitset 位

https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/comments/

迷惑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值