190-202

 

190:颠倒二进制位 

位运算一直是我的弱项 

class Solution:
    def reverseBits(self, n: int) -> int:
        ans = 0
        for i in range(32):
            if n & 1 << i:
                ans += 1 << (31 - i)
        return ans

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/reverse-bits/solution/wei-yun-suan-ling-ren-jue-wang-by-yizhu-lrj4d/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

191 :位1 的个数 

学了上一道题的一点皮毛。

class Solution:
    def hammingWeight(self, n: int) -> int:
        count = 0
        for i in range(32):
            if n & 1<<i == 2**i:
                count += 1
        return count

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/number-of-1-bits/solution/xue-liao-yi-dian-dian-yi-wei-cao-zuo-by-l5ltk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

192 : 

对不起 看不懂 

198: 打家劫舍  

逐渐放弃回溯 陷入DP温柔乡 

就记录到第i户时能获得的最大利润就可以了
get和noget 分别表示抢不抢当前户能获得的最大利润
不抢 那最大利润就是 前面的抢不抢里面大的那个
抢 前面一户必须不抢 就是不抢加上当前户

 

class Solution:
    def rob(self, nums: List[int]) -> int:
        get = 0
        noGet = 0
        for each in nums:
            temp = noGet
            noGet = max(noGet,get)
            get = temp + each
        return max(noGet,get)


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/house-robber/solution/a-ha-ha-ha-ha-zhu-jian-bei-pan-hui-su-xi-9qa5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

199 二叉树的右视图 

层序遍历中 记录每行的最后一个节点
如果是最后一个节点 就加入结果

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        queue = []
        i = 0
        queue.append(root)
        finalNode = root
        rel = []
        while i < len(queue):
            curNode = queue[i]
            i += 1
            if curNode.left:
                queue.append(curNode.left)
            if curNode.right:
                queue.append(curNode.right)
            if curNode == finalNode:
                rel.append(finalNode.val)
                finalNode = queue[-1]

        return rel
    
    

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/shi-jian-jing-ran-chai-zhe-yao-duo-by-yi-ak82/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

200: 岛屿数量  

先加边界  

如果不把边界0加入网格中 判断会判断的人欲死欲仙的 所以说 考虑再三还是把0加入边界之中
用visited表示一个网格有没有被访问过
遍历数组 如果一个1 没有被访问过 那么他是一个新的岛屿 岛屿数量加1
dfs他 看跟他相连的陆地 全部visited置为1
这样一个岛屿就被遍历完了

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m = len(grid)
        n = len(grid[0])
        grid.insert(0,['0']*n)
        grid.append(['0']*n)
        for i in range(m+2):
            grid[i].insert(0, '0')
            grid[i].append('0')
        visited = [[0] * (n+2) for i in range(m+2)]
        
        def dfs(x,y):
            visited[x][y] = 1
            if grid[x][y] == '1':
                if not visited[x-1][y]:
                    dfs(x-1, y)
                if not visited[x+1][y]:
                    dfs(x+1, y)
                if not visited[x][y-1]:
                    dfs(x, y-1)
                if not visited[x][y+1]:
                    dfs(x, y+1)
        count = 0
        for i in range(1,m+1):
            for j in range(1,n+1):
                if not visited[i][j] and grid[i][j] == '1' :
                    count += 1 
                    dfs(i, j )
        return count


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/number-of-islands/solution/heng-heng-qian-hou-bian-jie-xian-jia-ran-el85/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

201 : 

 

数字按位与 

思路就是 如果这个区间 涵盖了两个2的指数次方 结果肯定是0
比如 4到8 涵盖了2的 2次方 和3次方 那不用想 4和8就是0的 结果肯定是0
所以只能有一个区间 比如 5到7
那么5到7 首先最高位是100 就是4 确定了 不可能有其他的0 所以定下来了
其他位呢 就是他们地位自己的事情了 所以这里让他们减去最高位 递归求解。
5到7 变成求1到3 再加上高位的4 得到结果

如果题目是6到7 那就是4 加上 (2,3)的结果2 得到答案6

class Solution(object):
    def rangeBitwiseAnd(self, left, right):
        """
        :type left: int
        :type right: int
        :rtype: int
        """
        def getRel(left,right):
            i = 0
            if left == 0:
                return 0
            if left == right:
                return left
            while 2**i <= left:
                i += 1
            leftCount = i-1
            while 2**i <= right:
                i += 1
            rightCount = i       ##找到两端所在的指数次数区间
            if rightCount - leftCount > 1:                  #如果大于1 肯定是涵盖了2个指数大小 结果为0
                return 0
            else:
                return 2 ** leftCount + getRel(left-2 ** leftCount, right - 2 ** leftCount)   ##否则就去掉首位递归求解
        return getRel(left, right)

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/solution/python3-yi-ge-return0jiu-bao-cuo-jin-tia-hyvt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

202  快乐数 

简单但不 简单 

写了几个数 看了下规律 大概就是不是快乐数的一定会落入4,16,20,这种循环里
所以 。。。

代码

class Solution:
    def isHappy(self, n: int) -> bool:

        def getnumList(num):
            if num == 0:
                return [0]
            numlist = []
            while num > 0:
                numlist.append(num%10)
                num = num//10
            return numlist
            
        wrongNum = [4, 16, 20, 42, 37 ,58, 89, 145]
        for i in range(100):
            newNum = 0
            for each in getnumList(n):
                newNum += each**2

            if newNum == 1:
                return True
            elif newNum in wrongNum:
                return False
            n = newNum

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/happy-number/solution/zhe-ti-ye-bu-jian-dan-a-by-yizhu-jia-04vf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2022-03-26 21:17  yi术家  阅读(31)  评论(0编辑  收藏  举报