LeetCode刷题笔记之动态规划(三)

一、子序列/子数组问题

子序列:按原数组的顺序排列,不一定是原数组中的相邻元素组成的。即子序列可以是不连续的。
子数组:原数组中连续的几个元素组成的数组。

1. 300【最长递增子序列】

  • 题目:
    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
    子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
  • 代码:
class Solution {public int lengthOfLIS(int[] nums) {//dp表示以数组中第i个元素为结尾的最长严格递增子序列的长度//dp[i] = max(dp[j])+1,其中nums[j]是nums[i]左边小于nums[i]的元素//dp[0] = 1int[] dp = new int [nums.length];dp[0] = 1;int max = 1;for(int i=1;i<nums.length;i++){int tmp = 0;for(int j=0;j<i;j++){if(nums[j]<nums[i]){tmp = Math.max(tmp,dp[j]);}}dp[i] = tmp + 1;max = Math.max(dp[i],max);}return max;}
}

2. 72【编辑距离】

  • 题目: 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
    你可以对一个单词进行如下三种操作:
    • 插入一个字符
    • 删除一个字符
    • 替换一个字符
  • 代码:
class Solution {public int minDistance(String word1, String word2) {//两个字符串的操作,使用双指针,i指向word1,j指向word2//dp[i][j]表示由左向右操作到word1的第i个位置,word2的第j个位置需要的最少操作数。//dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)//dp[0][j] = j,dp[i][0] = iint m = word1.length();int n = word2.length();if(n==0) return m;if(m==0) return n;int[][] dp = new int [m+1][n+1];for(int i=0;i<=m;i++){dp[i][0] = i;}for(int i=0;i<=n;i++){dp[0][i] = i;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(word1.charAt(i-1)==word2.charAt(j-1)){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = minDp(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;}}}return dp[m][n];}public int minDp(int a,int b,int c){int tmp = Math.min(a,b);tmp = Math.min(tmp,c);return tmp;}
}

3. 53【最大子数组的和】

  • 题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
    子数组是数组中的一个连续部分。
  • 代码:
class Solution {public int maxSubArray(int[] nums) {//dp[i]表示以nums[i]为结尾的最大子数组的和//dp[i] = max(dp[i-1]+nums[i],nums[i])//dp[0] = nums[0]int[] dp = new int [nums.length];dp[0] = nums[0];int max = nums[0];for(int i=1;i<nums.length;i++){dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);max = Math.max(dp[i],max);}return max;}
}

4. 674【最长连续自增序列】

  • 题目: 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
    连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。
  • 代码:
//方法一:双指针
class Solution {public int findLengthOfLCIS(int[] nums) {//双指针法,固定左指针,移动右指针,//直到右指针所指元素不满足条件,将左指针指向右指针int i=0;int max = 1;for(int j=1;j<nums.length;j++){if(nums[j-1]<nums[j]){max = Math.max(max,j-i+1);}else{i = j;}}return max;}
}
//方法二:动态规划
class Solution {public int findLengthOfLCIS(int[] nums) {//dp[i]表示以第i个元素结尾的最长连续递增子序列的长度//dp[i]=1 or dp[i-1]+1//dp[0]=1int[] dp = new int[nums.length];dp[0] = 1;int max=1;for(int i=1;i<nums.length;i++){if(nums[i-1]<nums[i]){dp[i] = dp[i-1]+1;}else{dp[i] = 1;}max = Math.max(max,dp[i]);}return max;}
}

5. 718【最长重复子数组】

  • 题目: 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度。
  • 代码:
class Solution {public int findLength(int[] nums1, int[] nums2) {//dp[i][j]表示以nums1[i],nums2[j]结尾的最长的公共子数组长度//dp[i][j] = dp[i-1][j-1]+1 (nums1[i]==nums2[j])//dp[0][0] = 0(nums1[i-1]!=nums2[j-1]) or 1(nums1[i-1]==nums2[j-1])int n = nums1.length;int m = nums2.length;int[][] dp = new int[n][m];int max=0;for(int i=0;i<n;i++){if(nums1[i]!=nums2[0]){dp[i][0] = 0;}else{dp[i][0] = 1;}max = Math.max(dp[i][0],max);}for(int i=0;i<m;i++){if(nums1[0]!=nums2[i]){dp[0][i] = 0;}else{dp[0][i] = 1;}max = Math.max(dp[0][i],max);}for(int i=1;i<n;i++){for(int j=1;j<m;j++){if(nums1[i] == nums2[j]){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = 0;}max = Math.max(dp[i][j],max);}}return max;}
}

6. 1143【最长公共子序列】

  • 题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
    一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
    例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
    两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
  • 代码:
class Solution {public int longestCommonSubsequence(String text1, String text2) {//dp[i][j]表示以text1[i],text2[j]为结尾的最长公共子序列长度//dp[i][j] = dp[i-1][j-1]+1(text1[i]==text2[j]) or//dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])//dp[i][0] = 0(text1[0]!=text2[0]) or 1(text1[0]==text2[0])//dp[0][i] = 0(text1[0]!=text2[0]) or 1(text1[0]==text2[0])int n = text1.length();int m = text2.length();int[][] dp = new int[n][m];boolean flag = false;for(int i=0;i<n;i++){if((text1.charAt(i) == text2.charAt(0))||flag==true){dp[i][0] = 1;flag = true;}else {dp[i][0] = 0;}}int max=0;if(flag){max = 1;}flag = false;for(int i=0;i<m;i++){if((text1.charAt(0)==text2.charAt(i))||flag==true){dp[0][i] = 1;flag = true;}else{dp[0][i] = 0;}   }for(int i=1;i<n;i++){for(int j=1;j<m;j++){if(text1.charAt(i) == text2.charAt(j)){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = maxNum(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]);}max = Math.max(max,dp[i][j]);}}return max;}public int maxNum(int a,int b,int c){int tmp = Math.max(a,b);return Math.max(tmp,c);}
}

7. 647【回文子串】

  • 题目: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
  • 代码:
class Solution {public int countSubstrings(String s) {//dp[i][j]表示在substring(i,j+1)是否是回文串//dp[i][j] = true(s[i]==s[j]) or false(s[i]!=s[j])//因为i由i+1决定,j由j-1决定,所以需要从左下角开始遍历//dp[][0]=false or true,dp[n-1][]=false or trueint n = s.length();boolean[][] dp = new boolean[n][n];int ans = 0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s.charAt(i)==s.charAt(j)){if(j-i<=1){dp[i][j] = true;ans++;}else if(dp[i+1][j-1]){dp[i][j] = true;ans++;}}}}return ans;}
}

8. 5【最长回文子串】

  • 题目: 给你一个字符串 s,找到 s 中最长的回文子串。
    如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
  • 代码:
class Solution {public String longestPalindrome(String s) {//dp[i][j]表示substring(i,j+1)是否是回文串//dp[i][j] = true(s[i]==s[j]) or false(s[i]!=s[j])//dp[i][j] = true(s[i]==s[j] and j-i<=1 or dp[i+1][j-1])int n = s.length();boolean[][] dp = new boolean[n][n];int maxLen = 0;int index = 0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s.charAt(i) == s.charAt(j)){if(j-i<=1){dp[i][j] = true;}else if(dp[i+1][j-1]){dp[i][j] = true;}if(dp[i][j] && (maxLen < j-i+1)){maxLen = j-i+1;index = i;}}}}return s.substring(index,index+maxLen);}
}

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

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

相关文章

Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1、穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 解释&#xff1a;请求的数据既不在Redis中也不在数据库中&#xff0c;这时我们创建一个黑名单来存储该数据&#xff0c;下次再有类似的请求进来…

Q-Day提前?IBM警告:「量子+AI」将触发巨大风险!

Q-Day&#xff0c;即量子计算机强大到足以破解当前加密方案的时刻&#xff0c;原本被视为一个从近期到长期可能面临的挑战&#xff0c;而非刻不容缓的现实问题。然而&#xff0c;最新的研究发现似乎加速了这一天的到来。 IBM的研究团队在一篇论文中提出&#xff0c;混合量子经典…

测试学习1

学习目标 熟悉测试流程和规范&#xff0c;熟练掌握软件测试方法至少熟悉功能测试.性能测试.安全测试中的一种;熟练使用常用的测试工具&#xff0c;熟悉缺陷管理跟踪软件(禅道.Jira.QC等)&#xff0c;熟悉持续集成工具Jenkin;熟悉Linux操作系统&#xff0c;熟悉TCP/HTTPS等网络…

Redis入门到实战-第二十二弹

Redis实战热身Sentinel篇 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和流处理引擎的内存…

利用出海、Socks5代理与代理IP

在当今数字化时代&#xff0c;跨界电商已成为企业扩展业务、拓展市场的重要策略。然而&#xff0c;这种扩展并非没有风险。网络安全问题一直是跨界电商必须面对的挑战之一。为了确保数据安全、保护用户隐私&#xff0c;以及有效应对地区限制&#xff0c;出海、Socks5代理与代理…

谷歌DeepMind推出SIMA智能体,可以跟人一起玩游戏

谷歌 DeepMind 推出了 SIMA&#xff0c;这是一种通过训练学习游戏技能的人工智能代理&#xff0c;因此它玩起来更像人类&#xff0c;而不是一个只做自己事情的强大人工智能。 从早期与 Atari 游戏合作&#xff0c;到以人类大师级别玩《星际争霸 II》的 AlphaStar 系统&#xf…

【STM32CubeMX(2)】点亮第一个LED灯

通过本节可以学习到&#xff1a; 如何通过STM32CubeMX建立一个单片机工程如果是仿真下载需要注意些什么怎么通过HAL库使用外设功能 软件环境&#xff1a; STM32CubeMX version6.10.0 Keil_v5&#xff08;MDK-ARM&#xff09; version 5.32 硬件环境&#xff1a; STM32F103…

vue 列表渲染

v-for​ 我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; const items ref([{ message: Foo }, { message: Bar }]) <l…

Mysql数据库:主从复制与读写分离

目录 前言 一、Mysql主从复制概述 1、Mysql主从复制概念 2、Mysql主从复制功能和使用场景 2.1 功能&#xff08;为何使用主从复制&#xff09; 2.2 适用场景&#xff08;何时使用主从复制&#xff09; 3、Mysql复制的类型 3.1 基于SQL语句的复制&#xff08;Statement默…

态势感知平台简单介绍

什么是态势感知平台&#xff1f; 安全态势感知平台是一种综合型网络安全解决方案&#xff0c;其核心目标在于帮助企业提升对安全态势的感知能力&#xff0c;从而更有效地应对不断变化的网络威胁环境。 该平台具备多种核心功能。首先&#xff0c;它能够实现数据收集与整合&…

数字化对制造业生产效率的影响与优化策略

导 读 ( 文/ 1419 ) 在当今竞争激烈的市场环境下&#xff0c;制造业企业面临着日益增长的压力&#xff0c;需要不断提高生产效率以保持竞争力。数字化技术作为一种重要的生产力工具&#xff0c;已经在制造业中得到广泛应用。本文将探讨数字化对制造业生产效率的影响&#xff0c…

SpringBoot与Prometheus监控整合

参考&#xff1a; springboot实战之prometheus监控整合-腾讯云开发者社区-腾讯云 https://www.cnblogs.com/skevin/p/15874139.html https://www.jianshu.com/p/e5dc2b45c7a4

python可视化:tqdm进度条控制台输出模块

前言 在处理大量数据或执行耗时操作时&#xff0c;了解代码执行的进度是至关重要的。在Python中&#xff0c;通过使用进度条可以有效地实现对代码执行进度的可视化展示。 tqdm 是一个快速、可扩展的Python进度条库&#xff0c;能够实时显示代码执行的进度。并且它提供了简洁的A…

用Python机器学习模型预测世界杯结果靠谱吗?

看到kaggle、medium上有不少人用球队的历史数据来进行建模预测&#xff0c;比如用到泊松分布、决策树、逻辑回归等算法&#xff0c;很大程度上能反映强者恒强的现象&#xff0c;比如巴西、英格兰等大概率能进8强&#xff0c;就像高考模拟考试成绩越好&#xff0c;大概率高考也会…

数据仓库的建设步骤

1.需求&#xff0c;要和业务部门深入讨论&#xff0c;了解他们的现状&#xff0c;诉求&#xff0c;以及期望&#xff0c;包括我要分析什么内容&#xff0c;需要到什么样的颗粒度&#xff0c;数据从哪里来的&#xff0c;是手工还是系统&#xff0c;数据质量怎么样&#xff0c;期…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…

爬取肯德基餐厅查询中指定地点的餐厅数据

进入肯德基官网 代码编写 import requests import jsonif __name__ __main__:get_url http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opkeywordheaders {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快&#xff0c;城市规划和管理工作面临着前所未有的挑战&#xff0c;违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查&#xff0c;效率低下且难以全面覆盖。为了解决这一问题&#xff0c;现代…

Webgl学习系列-Webgl 入门

Webgl学习系列 第二章 Webgl 入门 文章目录 一、最短的webgl程序二、通过webgl绘制一个点三、webgl三维坐标 一、最短的webgl程序 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>…

【python基础教程】2. 算法的基本要素与特性

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…