Leetcode 算法面试冲刺 热题 HOT 100 刷题(75 76 78 79 84)(五十八)

news/2024/7/8 9:39:29 标签: leetcode, 算法, 职场和发展

文章目录

  • 75. 颜色分类
  • 76. 最小覆盖子串
  • 78. 子集
  • 79. 单词搜索
  • 84. 柱状图中最大的矩形

75 78 79

75. 颜色分类

在这里插入图片描述
就用了一个排序算法

class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if not nums or len(nums) == 0:
            return
        n = len(nums)
        for i in range(n - 1):
            for j in range(i + 1, n):
                if nums[i] > nums[j]:
                    nums[i], nums[j] = nums[j], nums[i]
        return nums

双指针的方法,回头再翻回来看吧。

第二遍复盘,两遍双指针。

class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if not nums or len(nums) == 0:
            return
        
        left, right = 0, len(nums) - 1
        while left < right:
            while left < right and nums[left] == 0:
                left += 1
            while left < right and (nums[right] == 2 or nums[right] == 1):
                right -= 1
            nums[left], nums[right] = nums[right], nums[left]
        right = len(nums) - 1

        while left < right:
            while left < right and nums[left] == 1:
                left += 1
            while left < right and nums[right] == 2:
                right -= 1
            nums[left], nums[right] = nums[right], nums[left]
        return nums

在这里插入图片描述
在这里插入图片描述

76. 最小覆盖子串

在这里插入图片描述
在这里插入图片描述

看了答案,挺难的,先跳过吧。

78. 子集

在这里插入图片描述
知道要用回溯,但是不会写

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if not nums or len(nums) == 0:
            return 
        n = len(nums)
        pth = []
        res = []
        for i in nums:
            if i not in pth:
                pth.append(i)
                
            pth.pop()

        def backtracking(nums, pth, res):

下面是答案:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []
        n = len(nums)
        
        def helper(i, tmp):
            res.append(tmp)
            for j in range(i, n):
                helper(j + 1,tmp + [nums[j]] )
        helper(0, [])
        return res  

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []
        tmp = []
        def backtrace(nums, startindex):
            #if startindex >= len(nums):
            res.append(tmp[:])
            for i in range(startindex, len(nums)):
                tmp.append(nums[i])
                backtrace(nums, i + 1)
                tmp.pop()

        nums = sorted(nums)
        backtrace(nums, 0)
        return res

写出来了,还得复习

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if not nums or len(nums) == 0:
            return 
        n = len(nums)
        pth = []
        res = []
        def backtracking(pth, start):
            res.append(pth[:])
            for i in range(start, n):
                pth.append(nums[i])
                backtracking(pth, i + 1)
                pth.pop()
        backtracking(pth, 0)
        return res
               

在这里插入图片描述
第二遍写了,还是懵懵懂懂,递归九讲,必须再复习刷一下题。

class Solution:
    def subsets(self, nums: List[int]):
        if not nums or len(nums) == 0:
            return 
        res, tmp = [], []
        def helper(start):
            res.append(tmp[:])
            for i in range(start, len(nums)):
                tmp.append(nums[i])
                helper(i + 1)
                tmp.pop()
        nums = sorted(nums)
        helper(0)
        return res


79. 单词搜索

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面试考过,不会。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

const exist = (board, word) => {
    const m = board.length;
    const n = board[0].length;
    const used = new Array(m);    // 二维矩阵used,存放boolfor (let i = 0; i < m; i++) {
        used[i] = new Array(n);
    }
    // canFind 判断当前点是否是目标路径上的点
    const canFind = (row, col, i) => { // row col 当前点的坐标,i当前考察的word字符索引
        if (i == word.length) {        // 递归的出口 i越界了就返回true
            return true;
        }
        if (row < 0 || row >= m || col < 0 || col >= n) { // 当前点越界 返回false
            return false;
        }
        if (used[row][col] || board[row][col] != word[i]) { // 当前点已经访问过,或,非目标点
            return false;
        }
        // 排除掉所有false的情况,当前点暂时没毛病,可以继续递归考察
        used[row][col] = true;  // 记录一下当前点被访问了
        // canFindRest:基于当前选择的点[row,col],能否找到剩余字符的路径。
        const canFindRest = canFind(row + 1, col, i + 1) || canFind(row - 1, col, i + 1) ||
            canFind(row, col + 1, i + 1) || canFind(row, col - 1, i + 1); 

        if (canFindRest) { // 基于当前点[row,col],可以为剩下的字符找到路径
            return true;    
        }
        used[row][col] = false; // 不能为剩下字符找到路径,返回false,撤销当前点的访问状态
        return false;
    };

    for (let i = 0; i < m; i++) { // 遍历找起点,作为递归入口
      for (let j = 0; j < n; j++) {
        if (board[i][j] == word[0] && canFind(i, j, 0)) { // 找到起点且递归结果为真,找到目标路径
          return true; 
        }
      }
    }
    return false; // 怎么样都没有返回true,则返回false
};

在这里插入图片描述
这个想法太优美了。

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        m, n = len(board), len(board[0])
        used = [[False] * n for _ in range(m)]
        def dfs(row, col, i): # 判断当前点是否是目标路径上的点. row col 当前点的坐标,i当前考察的word字符索引
            if i == len(word): # 递归结束条件 : 找到了单词的最后一个
                return True
            if row < 0 or row >= m or col < 0 or col >= n: # 越界
                return False
            if used[row][col] or board[row][col] != word[i]:# 已经访问过,或者不是word里的字母
                return False
            # 排除掉上面的false情况,当前点是合格的,可以继续递归考察
            used[row][col] = True #  记录一下当前点被访问了
            if dfs(row+1, col, i+1) or dfs(row-1, col, i+1) or dfs(row, col+1, i+1) or dfs(row, col-1, i+1): # 基于当前点[row,col],可以为剩下的字符找到路径
                return True
            used[row][col] = False # 不能为剩下字符找到路径,返回false,撤销当前点的访问状态,继续考察别的分支
            return False


        for i in range(m):
            for j in range(n):
                if board[i][j] == word[0] and dfs(i, j, 0):
                    return True
        return False

尝试自己写了下,还要复习第二遍。

class Solution:
    def exist(self, board: List[List[str]], word: str):
        m, n = len(board), len(board[0])
        print(m, n)
        visited = [[False] * n for _ in range(m)]
        def dfs(row, col, i):
            if i == len(word):
                return True
            if row < 0 or row >= m or col < 0 or col >= n:
                return False
            if visited[row][col] or board[row][col] != word[i]:
                return False
            visited[row][col] = True
            if dfs(row + 1, col, i + 1) or dfs(row - 1, col, i + 1) or dfs(row, col + 1, i + 1) or dfs(row, col - 1, i + 1):
                return True
            visited[row][col] = False
            return False
        for i in range(m):
            for j in range(n):
                if board[i][j] == word[0] and dfs(i, j, 0):
                    return True
        return False
            

在这里插入图片描述

84. 柱状图中最大的矩形

在这里插入图片描述
在这里插入图片描述
不会。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

from typing import List


class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        size = len(heights)
        res = 0

        for i in range(size):
            left = i
            cur_height = heights[i]
            while left > 0 and heights[left - 1] >= cur_height:
                left -= 1

            right = i
            while right < size - 1 and heights[right + 1] >= cur_height:
                right += 1

            max_width = right - left + 1
            res = max(res, max_width * cur_height)
        return res

我写的暴力解法:

class Solution:
    def largestRectangleArea(self, heights: List[int]):
        if not heights or len(heights) == 0:
            return 0
        n = len(heights)
        res = 0
        for i in range(n):
            cur_height = heights[i]
            left = i
            while left > 0 and heights[left - 1] >= cur_height:
                left -= 1
            right = i
            while right < n - 1 and heights[right + 1] >= cur_height:
                right += 1
            max_width = right - left + 1
            res = max(res, max_width * cur_height)
        return res

在这里插入图片描述


http://www.niftyadmin.cn/n/1207622.html

相关文章

MyBatis学习总结(5)——实现关联表查询

一、一对一关联 1.1、提出需求 根据班级id查询班级信息(带老师的信息) 1.2、创建表和数据 创建一张教师表和班级表&#xff0c;这里我们假设一个老师只负责教一个班&#xff0c;那么老师和班级之间的关系就是一种一对一的关系。 1 CREATE TABLE teacher(2 t_id INT PRIMARY…

Leetcode 算法面试冲刺 热题 HOT 100 刷题(85 94 96 98 101)(五十九)

文章目录85. 最大矩形94. 二叉树的中序遍历96. 不同的二叉搜索树98. 验证二叉搜索树101. 对称二叉树85. 最大矩形 94. 二叉树的中序遍历 简单题 def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:if not root: return []res []def dfs(root, res):if n…

ifcfg、ip、ss,配置文件

ifcfg、ip、ss&#xff0c;配置文件一、ifcfg1、ifconfig命令&#xff1a;命令使用格式&#xff1a;ifonfig [INTERFACE]#ifconfig -a :显示所有接口&#xff0c;包括inactive状态的接口ifconfig interface [aftype] options | address..#ifconfig IFACE IP/MASK [up|down]例&a…

Leetcode 算法面试冲刺 热题 HOT 100 刷题(102 104 105 114 121)(六十)

文章目录102. 二叉树的层序遍历104. 二叉树的最大深度105. 从前序与中序遍历序列构造二叉树114. 二叉树展开为链表121. 买卖股票的最佳时机102. 二叉树的层序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone…

二维码显示要求

1&#xff1a;鼠标挪到二维码时能正常显示 2&#xff1a;显示的速度 3&#xff1a;抽象出一个方法转载于:https://www.cnblogs.com/lxq0924/p/5082619.html

Leetcode 算法面试冲刺 热题 HOT 100 刷题(124 128 136 139 141)(六十一)

文章目录124. 二叉树中的最大路径和128. 最长连续序列136. 只出现一次的数字139. 单词拆分141. 环形链表124. 二叉树中的最大路径和 困难题&#xff0c;我先跳过。 128. 最长连续序列 不会。 class Solution {public int longestConsecutive(int[] nums) {Set<Integer&…

自定义颜色清屏

openGL默认情况下清屏将RGB分量清零&#xff0c;所以屏幕变成黑色。采用如下的函数&#xff1a;glClear(GL_COLOR_BUFFER_BIT)。当然可以自定义清屏的颜色&#xff0c;采用如下的函数&#xff1a;glClearColor(1.0f, 0.0f, 0.0f, 0.0f)&#xff0c; 将屏幕渲染成红色void myDis…

目标检测 Chapter1 传统目标检测方法

文章目录目标检测问题定义介绍目标检测和图像分类、图像分割的区别目标检测问题方法传统目标检测深度学习目标检测传统 Vs 深度学习传统目标检测综述Viola-JonesHOGSVMDPMNMS 非极大值抑制目标检测问题定义 介绍 目标种类与数量问题&#xff1a;种类不同。种类越多&#xff0c…