多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

news2025/3/29 9:02:48

多维动态规划

不同路径

https://leetcode.cn/problems/unique-paths/

核心思路

比较简单

f[i][j] = f[i - 1][j] + f[i][j - 1] ;

示例代码

class Solution {
    public int uniquePaths(int n, int m) {
        int[][] f = new int[n][m];
        for (int i = 0; i < n; i++)
            f[i][0] = 1;
        for (int j = 0; j < m; j++)
            f[0][j] = 1;

        if (n + m >= 4) {
            for (int i = 1; i < n; i++) {
                for (int j = 1; j < m; j++) {
                    f[i][j] += f[i - 1][j];
                    f[i][j] += f[i][j - 1];
                }
            }
        }

        return f[n - 1][m - 1];
    }
}

最小路径和

https://leetcode.cn/problems/minimum-path-sum/

核心思路

比较简单

f[i][j]为到达(i,j)处 的最短路径和

示例代码

class Solution {
    public int minPathSum(int[][] f) {
        int n = f.length;
        int m = f[0].length;
        for (int i = 1; i < n; i++)
            f[i][0] += f[i-1][0];
        for (int j = 1; j < m; j++)
            f[0][j] += f[0][j-1];
        if(n+m>=4){
            for (int i = 1; i < n; i++) {
                for (int j = 1; j < m; j++) {
                    f[i][j] += Math.min(f[i - 1][j],f[i][j - 1]);
                }
            }
        }

        return f[n - 1][m - 1];
    }
}

最长回文子串

https://leetcode.cn/problems/longest-palindromic-substring/

核心思路

  1. 双重循环遍历
    • 外层循环遍历字符串中的每个字符,作为回文中心的可能起点。
    • 内层循环遍历两种情况:奇数长度回文和偶数长度回文。j=0代表奇数长度回文(中心是一个字符),j=1代表偶数长度回文(中心是两个字符之间的空隙)。
  2. 双指针扩展
    • 对于每个回文中心(或中心空隙),使用两个指针leftright分别向左和向右扩展,检查字符是否相等。
    • 如果相等,继续扩展;如果不相等,停止扩展。
  3. 调整指针位置
    • left多减了一次,right多加了一次。
  4. 更新最长回文信息

示例代码

class Solution {
    public String longestPalindrome(String s) {
        char[] ch = s.toCharArray();
        int n = ch.length;
        int maxStart = 0;
        int maxLength = 0;
        for(int i = 0; i < n; i++){
            for(int j =0; j < 2; j++){
                int left = i;
                int right = i+j;
                while(left >= 0 && right < n && ch[left] == ch[right]){
                    left--;
                    right++;
                }
                left++;
                right--;

                if(maxLength<right-left+1){
                    maxLength = right - left + 1;
                    maxStart = left;
                }
            }
        }
        return s.substring(maxStart,maxStart+maxLength);
    }
}

最长公共子序列

https://leetcode.cn/problems/longest-common-subsequence/

核心思路

  1. 定义状态:
    使用一个二维数组 f,其中 f[i][j] 表示 text1 的前 i 个字符与 text2 的前 j 个字符的最长公共子序列的长度。

  2. 状态转移方程:
    如果 text1[i-1] 与 text2[j-1] 相等(注意索引偏移),那么可以通过 f[i-1][j-1] 1 来更新 f[i][j]: [ f[i][j] = f[i-1][j-1] + 1 ]
    如果不相等,则最长公共子序列的长度为从 text1 的前 i 个字符与 text2 的前 j-1 个字符或 text1 的前 i-1 个字符与 text2 的前 j 个字符中选择较大的:

    [ f[i][j] = max(f[i-1][j], f[i][j-1]) ]

示例代码

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length(), n = text2.length();
        int[][] dp = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++) {
            char c1 = text1.charAt(i - 1);
            for (int j = 1; j <= n; j++) {
                char c2 = text2.charAt(j - 1);
                if (c1 == c2) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[m][n];
    }   
}
class Solution {
    public int longestCommonSubsequence(String text1, String text2){
        int n=text1.length();
        int m=text2.length();
        char[] t=text2.toCharArray();
        int [] f=new int[m+1];
        for(char x:text1.toCharArray()){
            int pre=0;
            for(int j=0;j<m;j++){
                int temp=f[j+1];
                f[j+1]= x==t[j] ? pre+1 : Math.max(f[j],f[j+1]);
                pre=temp;
            }
        }
        return f[m];
    }
}

编辑距离

https://leetcode.cn/problems/edit-distance/

核心思路

f[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最小操作次数。

示例代码

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        int[][] f = new int[n + 1][m + 1];

        for (int i = 0; i <= m; i++)
            f[0][i] = i;
        for (int i = 0; i <= n; i++)
            f[i][0] = i;

        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++) {
                //相等就不动
                if (word1.charAt(i) == (word2.charAt(j)))
                    f[i + 1][j + 1] = f[i][j];
                else {
                    //插入与替换
                    f[i + 1][j + 1] = Math.min(Math.min(f[i + 1][j], f[i][j + 1]), f[i][j]) + 1;
                }
            }
        return f[n][m];
    }
}

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

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

相关文章

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…

unittest自动化测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…

leetcode3.无重复字符的最长字串

采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…

3.25-2request库

request库 一、介绍request库 &#xff08;1&#xff09;requests是用python语言编写的简单易用的http库&#xff0c;用来做接口测试的库&#xff1b; &#xff08;2&#xff09;接口测试自动化库有哪些&#xff1f; requests、urllib 、urllib2、urllib3、 httplib 等&…

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题&#xff0c;但是我们还要把最优方案输出出来&#xff0c;我们可以用个pre数组来维护就行了&#xff0c;每当我们更新以i为结尾的最长子序列&#xff0c;如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…

LVS NAT模式实现三台RS的轮询访问

节点规划: 配置RS&#xff1a; RS1-RS3的网关配置均为 192.168.163.8 配置RS1&#xff1a; [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app

Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…

【机器学习】什么是线性回归?

什么是线性回归&#xff1f; 线性回归是一种 监督学习算法&#xff0c;它通过拟合一个直线&#xff08;或平面&#xff0c;高维空间下是超平面&#xff09;来建立 输入特征 和 输出目标 之间的关系。简单来说&#xff0c;线性回归就是找出一个数学方程&#xff08;通常是线性方…

零、ubuntu20.04 安装 anaconda

1.anaconda下载 地址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择&#xff1a;Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录&#xff0c;选在在终端中打开&#xff0c;然后在终端输入安装命…

Web纯前端实现在线打开编辑保存PPT幻灯片

很多项目中有时会需要在线打开PPT并编辑保存到服务器。猿大师办公助手可以完美调用本地office在线打开ppt文件&#xff0c;跟本地打开效果一样。还可以在线打开word、excel、pdf等文件&#xff0c;支持本机OFFICE完整嵌入模式&#xff0c;本机OFFICE所有功能基本都可以在网页上…

LeetCode热题100精讲——Top3:最长连续序列【哈希】

你好&#xff0c;我是安然无虞。 文章目录 题目背景最长连续序列C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题&#xff0c;用这3种数据类型足矣 最长连续序列 题目链接&#x…

2025年渗透测试面试题总结-某 长亭(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 长亭 一、Spring SpEL表达式注入漏洞 1. 技术原理 2. 利用条件 3. 攻击方法 4. 防御策略 二、Jav…

Ubuntu部署Dufs文件服务器

安装dufs 安装cargo apt install cargo升级rust工具链 apt install rustup rustup update stable查看rust版本&#xff0c;需要>1.81 rustc --version安装dufs cargo install dufs将dufs加入环境变量 sudo vim ~/.bashrc export PATH"$HOME/.cargo/bin:$PATH" sou…

前端模拟 websocket 请求小工具

背景&#xff1a; 后端写好websocket 接口后&#xff0c;用postman的某些版本无法直接模拟websocket请求&#xff0c;所以想着自制一个小工具。 使用方法&#xff1a; 直接复制以下代码到文本文件中&#xff0c;修改服务端端地址&#xff0c;保存为 .html的后缀名&#xff0c;…

【极速版 -- 大模型入门到进阶】快速了解大型语言模型

文章目录 &#x1f30a; 大模型作为一种生成式人工智慧&#xff0c;厉害在哪儿&#xff1f;-> 通用能力&#x1f30a; LLM 如何生成输出&#xff1a;简而言之就是文字接龙&#x1f30a; GPT 之前 ...&#xff1a;模型规模和数据规模概览&#x1f30a; ChatGPT 有三个训练阶段…