【算法】问题描述关键提取——提炼一般的解决思路

文章目录

    • 前言
    • 排序
      • 关键/关键词
      • 2389. 和有限的最长子序列
      • 关键/关键词
      • 2390. 从字符串中移除星号
    • 拓扑排序
      • 关键/关键词
      • 207. 课程表
      • 2392. 给定条件下构造矩阵
    • 线性DP
      • 关键/关键词
      • 最长公共子序列
        • 1143. 最长公共子序列
      • 最长递增子序列
        • 300. 最长递增子序列
        • 与最长公共子序列的联系
        • 动态规划转为二分贪心
    • 状态机DP
      • 关键/关键词
      • 122. 买卖股票的最佳时机 II

前言

在数据结构与算法中,理解和运用是两个方面。
写这篇博文,为的是保留下自己运用各种算法解决问题的经验,顺便给有缘人阅读,持续更新。

排序

关键/关键词

如果对顺序没有要求,可先排个序。
一般来说吗,引入了单调性之后,问题会更容易解决。

2389. 和有限的最长子序列

原题链接:2389. 和有限的最长子序列

Python3代码:


class Solution:def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:# 1. 关键词:子序列,求和# 2. 要求的和数组元素在数组中的顺序无关# 3. 先对数组排序,方便回答询问# 4. 前缀和# 5. 回答询问,在前缀和上二分nums.sort()for i in range(1, len(nums)):nums[i] += nums[i - 1] # 前缀和for i, q in enumerate(queries):# 把 >= q的边界queries[i] = bisect.bisect_right(nums, q)return queries

关键/关键词

  • 相邻
  • 消除

2390. 从字符串中移除星号

原题链接:2390. 从字符串中移除星号

Python3代码:

class Solution:def removeStars(self, s: str) -> str:# 关键词:相邻、消除# 思路: 栈stk = []for e in s:if e == '*':stk.pop()else:stk.append(e)return ''.join(stk)

拓扑排序

关键/关键词

要求找到一种符合要求的顺序。

207. 课程表

原题链接:207. 课程表

板子题,就是按要求进行排序。

Python3代码:

from collections import dequeclass Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:order = []in_degree = [0] * numCoursesedges = [[] for _ in range(numCourses)]for x, y in prerequisites:edges[x].append(y)in_degree[y] += 1q = deque(i for i, x in enumerate(in_degree) if x == 0)while q:cur = q.popleft()order.append(cur)for y in edges[cur]:in_degree[y] -= 1if in_degree[y] == 0:q.append(y)return True if len(order) == numCourses else False

2392. 给定条件下构造矩阵

原题链接:2392. 给定条件下构造矩阵

其实就是,要找出一个满足题目要求的各个数字在行和列上面的顺序的矩阵,也就是拓扑排序。

Python3代码:

from collections import dequeclass Solution:def buildMatrix(self, k: int, rowConditions: List[List[int]], colConditions: List[List[int]]) -> List[List[int]]:# 1. 行:1和3都要在2上面# 2. 列:2在1左边,3在2左边,那么就是3  2  1# 3. 找到一种合理的顺序# 4. 拓扑排序def topo_sort(edges):# 建图,邻接表g = [[] for _ in range(k)]# 表示第 i 门课程剩余的先修课的数目,一旦这个数目为0,代表可以修第 i 门课left = [0] * kfor x, y in edges:x -= 1 # 为了方便记录,要符合索引,就得把数字减一y -= 1g[x].append(y)left[y] += 1 # 入度加一order = []q = deque(i for i, v in enumerate(left) if v == 0)while q:x = q.popleft()order.append(x)for y in g[x]:left[y] -= 1if left[y] == 0:q.append(y)# 如果排序结果中的节点个数,等于原图中的节点个数,代表排序成功。return order if len(order) == k else Nonerow = topo_sort(rowConditions)if row is None:return []col = topo_sort(colConditions)if col is None:return []pos = {x : i for i, x in enumerate(col)}ans = [[0] * k for _ in range(k)]for i, x in enumerate(row):# 把第 i 行的元素放在对应的列上面ans[i][pos[x]] = x + 1 # 因为之前为了方便减去了1,现在要加回来return ans

线性DP

关键/关键词

深刻理解、熟练运用经典的线性DP模型。

最长公共子序列

顾名思义,找两个序列(或者其它相关的概念)中的最长公共部分。

1143. 最长公共子序列

原题链接:1143. 最长公共子序列

Python3代码:

from functools import cacheclass Solution:def longestCommonSubsequence(self, s: str, t: str) -> int:n = len(s)m = len(t)f = [0] * (m + 1)for i, x in enumerate(s):pre = f[0] # 左上角for j, y in enumerate(t):tmp = f[j + 1]if x == y:f[j + 1] = pre + 1else:# 因为空间压缩到了一维数组上,所以下面其实是max(左,上)f[j + 1] = max(f[j + 1], f[j])# 新的左上角pre = tmpreturn f[m]# @cache# def dfs(i, j):#     if i < 0 or j < 0:#         return 0#     if text1[i] == text2[j]:#         return dfs(i - 1, j - 1) + 1#     return max(dfs(i - 1, j), dfs(i, j - 1))# return dfs(n - 1, m - 1)

最长递增子序列

顾名思义,就是找到一个序列(或者说数组等诸如此类的东西)中的最长递增的子序列。

300. 最长递增子序列

原题链接:300. 最长递增子序列

Python3代码:

from functools import cacheclass Solution:def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)f = [0] * nfor i in range(n):for j in range(i):if nums[j] < nums[i]:f[i] = max(f[i], f[j])f[i] += 1return max(f)# @cache# def dfs(i):#     if i == 0:#         return 1#     res = 0#     for j in range(i):#         if nums[j] < nums[i]:#             res = max(res, dfs(j))#     return res + 1# return max(dfs(i) for i in range(len(nums)))
与最长公共子序列的联系

假设我们有一个序列叫nums,现在计算一个基于原本的序列的排序、去重(如果要求严格递增则需要去重,可以相等则无需去重)后的副本nums_copy,计算它们的最长公共子序列,即最长递增子序列

示例Python3代码:

from functools import cacheclass Solution:def lengthOfLIS(self, nums: List[int]) -> int:nums_copy = sorted(set(nums))def LCS(s, t):n = len(s)m = len(t)dp = [[0] * (m + 1) for _ in range(n + 1)]for i in range(n):for j in range(m):if s[i] == t[j]:dp[i + 1][j + 1] = dp[i][j] + 1else:dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j])return dp[n][m]return LCS(nums, nums_copy)
动态规划转为二分贪心

设置数组gg[i]代表长为i + 1的递增子序列的末尾元素的最小值,利用二分查找维护数组g,最终g的长度就是最长递增子序列的长度。

其实不仅仅在此题,这个精妙的思路在一些其它问题中也适用。

Python3代码:

from functools import cache
from bisect import bisect_leftclass Solution:def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)g = []for x in nums:j = bisect_left(g, x)if j == len(g):g.append(x)else:g[j] = xreturn len(g)

状态机DP

引自博客园 BeautifulWater

DP状态机这类问题往往是强调某一个阶段和上一个阶段之间的联系,且一个阶段里面有多种状态(比如说“有”和“无”)。

股票问题中,状态无非就两种:

  • 有股票
  • 无股票

关键/关键词

理清状态。

122. 买卖股票的最佳时机 II

原题链接:122. 买卖股票的最佳时机 II

class Solution:def maxProfit(self, prices: List[int]) -> int:@cachedef dfs(i, hold):if i < 0:return -inf if hold else 0if hold:return max(dfs(i - 1, True), dfs(i - 1, False) - prices[i])return max(dfs(i - 1, False), dfs(i - 1, True) + prices[i])return dfs(len(prices) - 1, False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【复现】某公司指挥调度管理平台 RCE漏洞_51

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

P1441 背包九讲(3):完全背包问题

P1441 背包九讲3&#xff1a;完全背包问题 一、原题呈现1、题目描述2、输入描述3、输出描述4、样例输入5、样例输出6、提示信息 二、思路分析1、其实这题就是01背包的变形2、但是本题全开二维数组会超内存&#xff0c;因此我们使用两个一维数组进行计算并且复制 三、整体代码 一…

视频生成模型作为世界模拟器

我们探索了在视频数据上大规模训练生成模型。具体来说&#xff0c;我们联合训练文本条件扩散模型&#xff0c;处理不同持续时间、分辨率和宽高比的视频和图像。我们利用一种在时空补丁上操作视频和图像潜码的transformer架构。我们最大的模型&#xff0c;Sora&#xff0c;能够生…

树状菜单(利用映射-bootstrap+jQuery实现折叠功能)

效果&#xff08;默认全部展开&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%;

CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%; 关键是background-size:100% 100%; background-size:100% 100%; background-size:100% 100%; background-size:contain; 保持纵横比, 容器部分可能空白background-size:cover; 保…

解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

解释器模式 1.简介 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义语言的文法&#xff0c;并且解释语言中的表达式。在Java中&#xff0c;解释器模式可以用于构建解释器以解析特定的语言或表达式&#xff0c;如数学表达式、…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

【lesson57】信号量和生产者消费者模型(环形队列版)

文章目录 信号量概念信号量接口初始化销毁等待发布 基于环形队列的生产者消费者模型编码Common.hLockGuard.hppTask.hppsem.hppRingQueue.hppConProd.cc 信号量概念 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的…

【测试】JUnit

目 录 一.注解二.断言三.用例的执行顺序四.参数化五.测试套件 自动化就是 selenium 脚本来实现的 junit 是 java 的单亓测试工具&#xff0c;只不过我们在实现自动化的时候需要借用一下下 junit 库里面提供的一些方法 引入依赖 Junit 5 <!-- https://mvnrepository.com/a…

自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

编程语言处理的核心是计算机如何理解和执行预定义的人工语言&#xff08;编程语言&#xff09;&#xff0c;而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代&#xff0c;其编程语言处理能力相较于前代模型有了显…

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…

256.【华为OD机试真题】会议室占用时间(区间合并算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

django报错:Cannot use ImageField because Pillow is not installed

1、问题概述 ERRORS: accounts.User.avatar: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow". System check identified 1 …

JDK1.8安装教程

目录 下载安装环境配置打开系统高级设置环境配置 验证安装是否成功 下载 https://www.oracle.com/java/technologies/downloads/#java8-windows 安装 打开安装包&#xff0c;点击下一步。 选择好自己熟悉的目的安装目录&#xff0c;点击下一步。 等待安装 选择好jre的安装目…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

java中的枚举

枚举 枚举类型的概述 关键字&#xff1a;enum 你可以把枚举类型理解成是一个自定义的常量的序列 枚举的语法结构 定义的枚举类型文件 package com.it.xiaosi.demo01;/*** Classname : direction* Description : TODO 枚举* Author : lin_refuelqq.com*/ public enum direct…

[talib][python]ta-lib所有whl文件下载地址汇总

TA-Lib-0.4.28-cp312-cp312-win-amd64.whl下载地址&#xff1a;https://download.csdn.net/download/FL1623863129/88589956 ta-lib-0.4.25-cp311-cp311-win-amd64.whl下载地址&#xff1a;https://download.csdn.net/download/FL1623863129/88265329 TA-Lib-0.4.24-cp310-cp31…

springboot第56集:微服务框架,物联网IOT,SQL数据库MySQL底层,AOP收集业务操作日志架构周刊...

单点登录 1.配置代理信息 /*请求登陆的方法*/ "/modelLogin": {//本地服务接口地址&#xff0c;这是测试环境&#xff0c;正式环境需要更改下地址target: "http://127.0.0.1:6776/xxx-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": …

在ubuntu中制作ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…