• leetcode 刷题


    leetcode 200 岛屿问题

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

    岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

    此外,你可以假设该网格的四条边均被水包围。

    示例 1:

    输入:grid = [
    ["1","1","1","1","0"],
    ["1","1","0","1","0"],
    ["1","1","0","0","0"],
    ["0","0","0","0","0"]
    ]
    输出:1
    示例 2:

    输入:grid = [
    ["1","1","0","0","0"],
    ["1","1","0","0","0"],
    ["0","0","1","0","0"],
    ["0","0","0","1","1"]
    ]
    输出:3

    提示:

    m == grid.length
    n == grid[i].length
    1 <= m, n <= 300
    grid[i][j] 的值为 '0' 或 '1'

    class Solution:
        def numIslands(self, grid: List[List[str]]) -> int:
            def dfs(grid,i,j):
                if not 0<=i<len(grid) or not 0<=j<len(grid[0]) or grid[i][j]=="0":
                    return 
                grid[i][j] = "0"
                dfs(grid,i+1,j)
                dfs(grid,i,j+1)
                dfs(grid,i-1,j)
                dfs(grid,i,j-1)
            count = 0
            for i in range(len(grid)):
                for j in range(len(grid[0])):
                    if grid[i][j]=="1":
                        dfs(grid,i,j)    # 这是让周边连起来为1的部分都变为0
                        count +=1
            return count
    

    考察的知识点为 深度优先遍历

    leetcode 199 二叉树的右视图

    给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

    示例 1:

    输入: [1,2,3,null,5,null,4]
    输出: [1,3,4]
    示例 2:

    输入: [1,null,3]
    输出: [1,3]
    示例 3:

    输入: []
    输出: []

    提示:

    二叉树的节点个数的范围是 [0,100]
    -100 <= Node.val <= 100

    class Solution:
        def rightSideView(self, root: TreeNode) -> List[int]:
            if not root:
                return []
            queue = [root]
            ans = []
            while queue:
                n = len(queue)
                temp = []
                for i in range(n):
                    node = queue.pop(0)
                    temp.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                ans.append(temp[-1])
            return ans
    

    考察知识点:层序遍历

    leetcode 198 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

    示例 1:

    输入:[1,2,3,1]
    输出:4
    解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
      偷窃到的最高金额 = 1 + 3 = 4 。
    示例 2:

    输入:[2,7,9,3,1]
    输出:12
    解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
      偷窃到的最高金额 = 2 + 9 + 1 = 12 。

    提示:

    1 <= nums.length <= 100
    0 <= nums[i] <= 400
    通过次数331,314提交次数657,178

    class Solution:
        def rob(self, nums: List[int]) -> int:
            if not nums:
                return 0
            n = len(nums)
            if n==1:
                return nums[0]
            dp = [0]*n #  dp[i]表示前i间房屋能够偷到的最大金额
    
            dp[0] = nums[0]
            dp[1] = max(nums[0],nums[1])
            for i in range(2,n):
                dp[i] = max(dp[i-2]+nums[i],dp[i-1])
            return dp[-1]
    

    考察知识点:动态规划

    leetcode 191 位1的个数

    编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

    提示:

    请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
    在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。

    示例 1:

    输入:00000000000000000000000000001011
    输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
    示例 2:

    输入:00000000000000000000000010000000
    输出:1
    解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
    示例 3:

    输入:11111111111111111111111111111101
    输出:31
    解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

    class Solution:
        def hammingWeight(self, n: int) -> int:
            count = 0
            while n:
                count += n&1 # 自己编写的,每次右移后和1进行与运算,看最后的一个数是不是1
                n >>=1
            return count 
    
    class Solution:
        def hammingWeight(self, n: int) -> int:
            ret = 0
            while n:
                n &= n - 1   # 题解中用到了一个结论 ,n&n-1可以把n中最后的一个1变为0
                ret += 1
            return ret
    

    leetcode 190 颠倒二进制位

    颠倒给定的 32 位无符号整数的二进制位。

    提示:

    请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
    在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。

    进阶:
    如果多次调用这个函数,你将如何优化你的算法?

    示例 1:

    输入: 00000010100101000001111010011100
    输出: 00111001011110000010100101000000
    解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
    因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
    示例 2:

    输入:11111111111111111111111111111101
    输出:10111111111111111111111111111111
    解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
      因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
    示例 1:

    输入:n = 00000010100101000001111010011100
    输出:964176192 (00111001011110000010100101000000)
    解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
    因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
    示例 2:

    输入:n = 11111111111111111111111111111101
    输出:3221225471 (10111111111111111111111111111111)
    解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
      因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

    提示:

    输入是一个长度为 32 的二进制字符串

    # 位运算
    class Solution:
        def reverseBits(self, n: int) -> int: # 直接将n的二进制颠倒过来后加到res上
            res = 0   
            for i in range(32):
                res = (res<<1) | (n&1)
                n>>=1
            return res 
    
    # 分治算法,值得好好理解一下
    class Solution:
        def reverseBits(self, n: int) -> int:
            n = (n>>16) | (n<<16)   # 先将前16位和后16位更新翻转
            n = ((n&0xff00ff00)>>8) | ((n&0x00ff00ff)<<8) # 将前16位得前8位和后8位进行翻转,将后16位得前8位于后8位进行翻转
            n = ((n&0xf0f0f0f0)>>4) | ((n&0x0f0f0f0f)<<4)
            n = ((n&0xcccccccc)>>2) | ((n&0x33333333)<<2)
            n = ((n&0xaaaaaaaa)>>1) | ((n&0x55555555)<<1)
            return n
    

    leetcode 189 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

    进阶:

    尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
    你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

    示例 1:

    输入: nums = [1,2,3,4,5,6,7], k = 3
    输出: [5,6,7,1,2,3,4]
    解释:
    向右旋转 1 步: [7,1,2,3,4,5,6]
    向右旋转 2 步: [6,7,1,2,3,4,5]
    向右旋转 3 步: [5,6,7,1,2,3,4]
    示例 2:

    输入:nums = [-1,-100,3,99], k = 2
    输出:[3,99,-1,-100]
    解释:
    向右旋转 1 步: [99,-1,-100,3]
    向右旋转 2 步: [3,99,-1,-100]

    提示:

    1 <= nums.length <= 2 * 104
    -231 <= nums[i] <= 231 - 1
    0 <= k <= 105

    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
            """
            Do not return anything, modify nums in-place instead.
            """
            """
            Do not return anything, modify nums in-place instead.
            """
            n = len(nums)
            k = k % n
            if k==0:
                return nums
            def swap(l,r):
                while (l<r):
                    nums[l],nums[r] = nums[r],nums[l]
                    l = l+1
                    r = r-1
            swap(0,n-k-1)
            swap(n-k,n-1)
            swap(0,n-1)
    
  • 相关阅读:
    如何去除电脑上软件图标的快捷键小箭头
    三维地图如何加载gltf数据代码
    实时获取三维地图相机角度,改变三维观赏角度
    完美解决win10家庭版本系统无法远程连接问题
    svn提交批量选中文件
    oracle sql developer 如何支持多个窗体,打开多张表,多个tab,同时查看多个数据表
    sqldevelper批量导出sql文件
    原生javascript与jquery的区别(持续记录)
    iframs里子,孙页面与父,爷页面,以及多层嵌套的iframe中,js变量,方法以及元素的互相获取,调用
    Eclipse如何将多行注释的星号去掉
  • 原文地址:https://www.cnblogs.com/zhou-lin/p/15029269.html
Copyright © 2020-2023  润新知