算法学习——LeetCode力扣补充篇6(132. 分割回文串 II、673. 最长递增子序列的个数、841. 钥匙和房间、463. 岛屿的周长)

算法学习——LeetCode力扣补充篇6

在这里插入图片描述

132. 分割回文串 II

132. 分割回文串 II - 力扣(LeetCode)

描述

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是
回文串

返回符合要求的 最少分割次数 。

示例

示例 1:

输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。

示例 2:

输入:s = “a”
输出:0

示例 3:

输入:s = “ab”
输出:1

提示

1 <= s.length <= 2000
s 仅由小写英文字母组成

代码解析

动态+递归(超时)
class Solution {
public:int result_num = INT_MAX;void trak_back(vector<vector<bool>> &dp , int indnx ,int result){if(indnx == dp[0].size()){if(result_num > result) result_num = result;return;}for(int i=0 ; i<dp[0].size() ;i++){if(dp[indnx][i] == true ){trak_back(dp,i+1,result+1);}}}int minCut(string s) {int result =0;vector<vector<bool>> dp(s.size() , vector<bool>(s.size(),false));for(int i=s.size()-1 ; i>=0 ;i--){for(int j=i ; j<s.size() ;j++){if(s[i]==s[j] && ( j-i<=1|| dp[i+1][j-1] == true )) dp[i][j] = true;}}trak_back(dp,0,result);return result_num-1;}
};
双DP
class Solution {
public:int minCut(string s) {vector<vector<bool>> dp(s.size() , vector<bool>(s.size(),false)); //dp[i][j]为i到j内是否是回文子串for(int i=s.size()-1 ; i>=0 ;i--){for(int j=i ; j<s.size() ;j++){if(s[i]==s[j] && ( j-i<=1|| dp[i+1][j-1] == true )) dp[i][j] = true;}}vector<int> dp2(s.size() , 0); //dp2[i] 为i内最少可以分为几段for(int i=0 ; i<s.size() ;i++) dp2[i] = i+1;//初始化,最差的情况,一个字符一段for(int i=0 ; i<s.size() ;i++) {if(dp[0][i] == true)  //如果0到i是一段,则不看0到i内部,直接dp2[i] = 1;{dp2[i] = 1;continue;}for(int j=0 ; j<i ;j++) //判断j+1 到 i是否是一段,如果是 在dp2[i] 和 dp[j]+1选最小if(dp[j+1][i] == true) dp2[i] = min(dp2[i] , dp2[j] + 1 );}return dp2[s.size()-1] - 1;}
};

673. 最长递增子序列的个数

673. 最长递增子序列的个数 - 力扣(LeetCode)

描述

给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。

示例

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

提示:

1 <= nums.length <= 2000
-106 <= nums[i] <= 106

代码解析

递归(超时)
class Solution {
public:int result = 0;vector<int> path;int max_path = 0;void track_back(vector<int>& nums , int indnx){if(path.size() > max_path){max_path = path.size();result = 1;}else if(path.size() == max_path) result++;if(indnx >= nums.size() ) return;for(int i = indnx ;i<nums.size();i++){if( (path.size() == 0)||(path.size() !=0 && nums[i] > path[path.size()-1]) ) {path.push_back(nums[i]);track_back(nums,i+1);path.pop_back();}}return;}int findNumberOfLIS(vector<int>& nums) {track_back(nums,0);return result;}
};
动态规划
class Solution {
public:int findNumberOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);//i以内的最长子序列vector<int> count(nums.size(),1);//i以内最长子序列的个数int max_long = 1;for(int i=1 ; i<nums.size() ;i++){for(int j=0 ; j<i ; j++){if(nums[i] > nums[j] && dp[i] < dp[j] + 1) //发现更长的最长子序列{count[i] = count[j]; dp[i] =  dp[j] + 1;}else if(nums[i] > nums[j] && dp[i] == dp[j] + 1) //发现和当前最长一样长的{count[i] += count[j];dp[i] = dp[i];}else if(nums[i] > nums[j] && dp[i] <= dp[j] + 1) //没发现最长的{dp[i] = dp[i];}if(dp[i] > max_long) max_long = dp[i];}}int result = 0;for(int i=0 ; i<nums.size() ;i++)if(dp[i] == max_long) result += count[i];return result;}
};

841. 钥匙和房间

841. 钥匙和房间 - 力扣(LeetCode)

描述

有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。

当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。

给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。

示例

示例 1:

输入:rooms = [[1],[2],[3],[]]
输出:true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。

示例 2:

输入:rooms = [[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。

提示

n == rooms.length
2 <= n <= 1000
0 <= rooms[i].length <= 1000
1 <= sum(rooms[i].length) <= 3000
0 <= rooms[i][j] < n
所有 rooms[i] 的值 互不相同

代码解析

class Solution {
public:void track_back(vector<vector<int>> &rooms ,vector<int> &keys , int indnx){if(keys[indnx] != 0 ) return;keys[indnx]++;for(int i=0 ; i<rooms[indnx].size() ; i++){track_back(rooms,keys,rooms[indnx][i]);}return;}bool canVisitAllRooms(vector<vector<int>>& rooms) {vector<int> keys(rooms.size() ,0);track_back(rooms,keys,0);for(int i=0 ; i<keys.size() ;i++) if(keys[i] == 0) return false;return true;}
};

463. 岛屿的周长

463. 岛屿的周长 - 力扣(LeetCode)

描述

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例

示例 1:

在这里插入图片描述

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

示例 2:

输入:grid = [[1]]
输出:4

示例 3:

输入:grid = [[1,0]]
输出:4

提示

row == grid.length
col == grid[i].length
1 <= row, col <= 100
grid[i][j] 为 0 或 1

代码解析

class Solution {
public:int result = 0;int m,n;int dir[4][2] = {0,-1,0,1,-1,0,1,0};void dfs(vector<vector<int>>& grid ,int x , int y){for(int i=0 ; i<4 ;i++){int next_x = x + dir[i][0];int next_y = y + dir[i][1];if(next_x<0||next_x>=m||next_y<0||next_y>=n) result++;else if(grid[next_x][next_y] == 0) result++;}return;}int islandPerimeter(vector<vector<int>>& grid) {m = grid.size();n = grid[0].size();for(int i=0 ; i<m ;i++){for(int j=0 ; j<n ;j++){if(grid[i][j] == 1)dfs(grid,i,j);}}return result;}
};

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

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

相关文章

CCIE-07-OSPF_TS

目录 实验条件网络拓朴逻辑拓扑实现目标 环境配置开始Troubleshooting问题1. R22的e0/0接口配置了网络类型问题2. R22和R21之间的IP地址子网掩码长度不一致问题3. R21的e0/0口配置了被动接口问题4. R3配置了不一致的hello-time问题5. R21配置了max-metric导致路由无效问题6. R3…

jQuery滑动

向下滑动&#xff1a;slideDown([speed],[easing],[fn]) 通过高度变化&#xff08;向下增大&#xff09;来动态地显示所有匹配的元素&#xff0c;在显示完成后可选地触发一个回调函数。 speed[,fn]&#xff1a; speed:三种预定速度之一的字符串("slow","norm…

开源的分布式文件系统 Fastdfs 安装入门介绍

fastdfs FastDFS 是一个开源的分布式文件系统&#xff0c;她对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;解决了大容量存储和负载均衡的问题。 特别适合以文件为载体的在线服务&…

深度学习评价指标(1):目标检测的评价指标

1. 简述 在计算机视觉/深度学习领域&#xff0c;每一个方向都有属于自己的评价指标。通常在评估一个模型时&#xff0c;只需要计算出相应的评价指标&#xff0c;便可以评估算法的性能。同时&#xff0c;所谓SOTA&#xff0c;皆是基于某一评价指标进行的评估。 接下来&#xff0…

【JavaWeb】Day29.SpringBootWeb请求响应——请求(二)

请求响应 4.数组集合参数 数组集合参数的使用场景&#xff1a;在HTML的表单中&#xff0c;有一个表单项是支持多选的(复选框)&#xff0c;可以提交选择的多个值。 4.1 数组 数组参数&#xff1a;请求参数名与形参数组名称相同且请求参数为多个&#xff0c;定义数组类型形参即…

IO流c++

IO流类库 输入输出流 #include <iostream> using namespace std;class InCount { public:InCount(int a 0, int b 0){c1 a;c2 b;}void show(void){cout << "c1" << c1 << "\t" << "c2" << c2 << …

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能&#xff0c;通常步骤如下&#xff1a; 在Controller类中&#xff0c;定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…

华为鲲鹏认证考试内容有哪些

华为鲲鹏认证考试的内容主要包括理论考核和实践考核两大部分。 在理论考核部分&#xff0c;主要考察考生对云计算、大数据、人工智能等相关领域的理论知识掌握情况&#xff0c;具体涉及体系结构、技术原理、应用场景等方面的内容。考生需要深入了解鲲鹏计算的特点&#xff0c;…

Pytorch 下载失败原因

错误信息&#xff1a; ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方案&#xff1a; 在官网看到&#xff0c;它需要python3.8-3.11的环境。过高和过低的版本都不…

JAVA面试大全之分布式篇

目录 1、一致性算法 1.1、什么是分布式系统的副本一致性?有哪些? 1.2、在分布式系统中有哪些常见的一致性算法?

Linux 学习之路 -- 工具篇 -- gcc / g++

在 Linux 系统中&#xff0c;gcc 和 g 是两个常用的编译工具&#xff0c;分别用于编译 C 和 C 代码。下面我将介绍gcc、g的一些基本用法 目录 一、简单的认识 二、简单了解一下编译的过程 <1> 预处理阶段 <2>编译 <3>汇编 <4>链接…

ssm012医院住院管理系统+vue

医院住院管理关系 摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院…

JavaAgent 技术原理及实战

JavaAgent 技术原理及实战 1、引子2、JavaAgent 简单示例&#xff1a;方法开始和结束时打印日志2.1 创建 Agent2.2 编写验证 agent 功能的测试类2.2.1 使用JavaAgent 静态加载方式2.2.2 使用 JavaAgent 动态加载方式 2.3、小结 3、JavaAgent3.1 JavaAgent是什么&#xff1f;3.2…

linux 软中断入门

在 linux 中&#xff0c;任务执行的载体有很多&#xff0c;包括线程&#xff0c;中断&#xff0c;软中断&#xff0c;tasklet&#xff0c;定时器等。但是从本质上来划分的话&#xff0c;任务执行的载体只有两个&#xff1a;线程和中断。软中断和 tasklet 的执行可能在中断中&am…

DevSecOps安全工具链介绍

目录 一、概述 二、安全工具链在平台中的定位 2.1 概述 2.2 分层定位 2.2.1 不同阶段的安全工具 2.2.2 安全工具金字塔 2.3 安全流水线集成概览 2.3.1 概述 2.3.2 标准流水线集成安全工具链概览图 三、安全工具链分类 3.1 概述 3.2 威胁建模类 3.2.1 威胁建模的概念…

Vue企业级项目开发axios

axios二次封装 import axios from axios 导入element-plus的信息弹窗 imort {elMessage} from element-plus//利用axios的create方法创建实例&#xff0c;配置默认请求头和请求超时时间 const request axios.create({url:/api,可以使用已经配置好的环境变量import.meta.env.V…

计算机网络:数据链路层 - 封装成帧 透明传输 差错检测

计算机网络&#xff1a;数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看&#xff0c;主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的&#xff0c;所谓链路就是从一个节点到相邻…

Android设备无线连接电脑及QXDM、QACT等工具的方法

首先样机和笔记本电脑连接同一wifi网络 adb root adb shell ifconfig复制inet addr地址 ping inet addr地址 adb tcpip 5555 adb connect (inet addr地址):5555 此时adb和机器使用wifi连接好了&#xff0c;可以拔出usb线 ipconfig查询电脑的IP地址 ipconfig使用adb在主机上…

2024系统架构师---解释器架构风格的概念与应用

解释器架构风格是一种软件架构模式&#xff0c;用于构建那些能够读取、解析并执行用户定义的命令或程序代码的系统。这种架构风格的关键在于提供一个运行时环境&#xff0c;它能够理解和执行预定义或用户定义的语言或指令集。通过这种方式&#xff0c;解释器模式能够为特定领域…

设计模式学习笔记 - 设计模式与范式 -行为型:1.观察者模式(上)

概述 前面已经学习了创建型和结构性设计模式&#xff0c;从本章开始开始学习行为型设计模式。创建型设计模式主要解决 “对象的创建” 问题&#xff0c;结构性设计模式主要解决 “类或对象的组合或组装” 问题&#xff0c;行为型设计模式主要解决 “类或对象之间的交互” 问题…