代码随想录算法训练营第36期DAY56

DAY56

套磁很顺利,发现又有书读了!

300最长递增子序列

  1. 朴素法,这个好想,但是不对,比如

0 1 0 3 2 3

我的算法会找出0 1 3作为答案,而不是0 1 2 3

可以看出,后面的状态依赖于前面的状态:选了前面的3,就不会选出后面的2 3;

没选前面的3,就能够选出后面的2 3.

错误代码:

  1. class Solution {
  2. public:
  3.     int lengthOfLIS(vector<int>& nums) {
  4.         int len=1;
  5.         for(int i=0;i<nums.size();i++){
  6.             int ilen=1;
  7.             int left=nums[i];
  8.             for(int j=i+1;j<nums.size();j++){
  9.                 if(left<nums[j]){
  10.                     ilen++;
  11.                     left=nums[j];
  12.                 }
  13.             }
  14.             len=max(len,ilen);
  15.         }
  16.         return len;
  17.     }
  18. };

  1. 动态规划,第一次接触,积攒经验。

Dp[i]的定义:dp[i]表示i之前包括i的以nums[i]为结尾的最长递增子序列的长度。

“尾部元素”很重要。

状态转移方程:好理解,遍历的思想

认真手写推导了,掌握了。

Code:

记得最后返回的是res就行,而不是dp的末位。

  1. class Solution {
  2. public:
  3.     int lengthOfLIS(vector<int>& nums) {
  4.         vector<intdp(nums.size(),1);
  5.         int res=1;
  6.         for(int i=1;i<nums.size();i++){
  7.             for(int j=0;j<i;j++){
  8.                 if(nums[i]>nums[j]) dp[i]=max(dp[i],dp[j]+1);
  9.             }
  10.             if(dp[i]>res) res=dp[i];
  11.         }
  12.         return res;
  13.     }
  14. };

674最长连续递增序列

复习。滑动窗口法。

精心总结滑动窗口代码模板, 直接搞定80道Leetcode算法题_哔哩哔哩_bilibili

朴素法:

  1. class Solution {
  2. public:
  3.     int findLengthOfLCIS(vector<int>& nums) {
  4.         //朴素
  5.         int res=1;
  6.         for(int i=0;i<nums.size()-1;i++){
  7.             for(int j=i;j<nums.size()-1;j++){
  8.                 if(nums[j]>=nums[j+1]) break;
  9.                 res=max(res,j+2-i);
  10.             }
  11.         }
  12.         return res;
  13.     }
  14. };

双指针:

  1. class Solution {
  2. public:
  3.     int findLengthOfLCIS(vector<int>& nums) {
  4.         //双指针
  5.         int res=1;
  6.         for(int l=0;l<nums.size();l++){
  7.             int r=l+1;
  8.             while(r<nums.size()&&nums[r]>nums[r-1]) r++;
  9.             res=max(res,r-l);
  10.         }
  11.         return res;
  12.     }
  13. };

滑动窗口复习:

精心总结滑动窗口代码模板, 直接搞定80道Leetcode算法题_哔哩哔哩_bilibili

练习:

209长度最小的子数组,中等

注意模版中,对与最长问题,要在外部while去更新bestres;

而在最短问题,需要在内部while去更新bestres;

  1. class Solution {
  2. public:
  3.     int minSubArrayLen(int target, vector<int>& nums) {
  4.         int l=0,r=0,bestres=0;
  5.         int cursum=0;
  6.         while(r<nums.size()){
  7.             cursum+=nums[r];
  8.             while(r<nums.size()&&cursum>=target){
  9.                 //这一句if也很重要
  10.                 if(r-l+1<bestres||bestres==0) bestres=r-l+1;
  11.                 cursum-=nums[l];
  12.                 l++;
  13.             }
  14.             r++;
  15.         }
  16.         return bestres;
  17.     }
  18. };

ACWING799最长连续不重复子序列

799最长连续不重复子序列_哔哩哔哩_bilibili

讲得很好,主要是要手写模拟一遍。

CODE:

  1. #include<iostream>
  2. using namespace std;
  3. const int N=100010;
  4. int n;
  5. int a[N],b[N];
  6. int main(){
  7.     cin>>n;
  8.     int res=0;
  9.     for(int i=0;i<n;i++) cin>>a[i];
  10.     // i denotes begin, j denotes end
  11.     for(int i=0,j=0;j<n;j++){
  12.         b[a[j]]++;
  13.         while(j>i&&b[a[j]]>1) b[a[i++]]--;
  14.         res=max(res,j-i+1);
  15.     }
  16.     cout<<res<<endl;
  17.     return 0;
  18. }

674最长连续递增序列

  1. 朴素 简单啦
  1. class Solution {
  2. public:
  3.     int findLengthOfLCIS(vector<int>& nums) {
  4.         int res=1;
  5.         for(int i=0;i<nums.size();i++){
  6.             int ilen=1;
  7.             for(int j=i+1;j<nums.size();j++){
  8.                 if(nums[j-1]<nums[j]) ilen++;
  9.                 else break;
  10.             }
  11.             res=max(res,ilen);
  12.         }
  13.         return res;
  14.     }
  15. };

  1. 双指针
  1. class Solution {
  2. public:
  3.     int findLengthOfLCIS(vector<int>& nums) {
  4.         int res=1;
  5.         for(int l=0;l<nums.size()-1;l++){
  6.             int llen=1;
  7.             int r=l+1;
  8.             while(r<nums.size()&&nums[r-1]<nums[r]) llen++,r++;
  9.             res=max(res,llen);
  10.         }
  11.         return res;
  12.     }
  13. };

  1. 动态规划

自己想出来了,很好。

  1. class Solution {
  2. public:
  3.     int findLengthOfLCIS(vector<int>& nums) {
  4.         int res=1;
  5.         vector<intdp(nums.size(),1);
  6.         for(int i=1;i<nums.size();i++){
  7.             if(nums[i-1]<nums[i]) dp[i]=dp[i-1]+1;
  8.             res=max(res,dp[i]);
  9.         }
  10.         return res;
  11.     }
  12. };

718最长重复子数组

  1. 很容易想到双指针,但是难点在于,怎么处理定位函数中,有多个定位函数结果,比如:

[0,1,3,2,5,8,9,7]

[0,5,4,2,6,2,3,4]

还是用动态规划吧。

  1. 动态规划,没接触过。

子数组就是连续子序列,没问题。

要想到:用二维数组记录两个字符串的所有比较情况。

学完了,在纸上手动推导一下DP数组:已完成。

一定要记得size()+1 初始化vector时候。

For()循环里也是<=size了,不然比较不完。

  1. class Solution {
  2. public:
  3.     int findLength(vector<int>& nums1, vector<int>& nums2) {
  4.         int res = 0;
  5.         // 一定要记得size()+1
  6.         vector<vector<int>> dp(nums1.size() + 1,
  7.                                vector<int>(nums2.size() + 10));
  8.         for (int i = 1; i <= nums1.size(); i++) {
  9.             for (int j = 1; j <= nums2.size(); j++) {
  10.                 if (nums1[i - 1] == nums2[j - 1])
  11.                     dp[i][j] = dp[i - 1][j - 1] + 1;
  12.                 res = max(res, dp[i][j]);
  13.             }
  14.         }
  15.         return res;
  16.     }
  17. };

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake详细解读

原文来自&#xff1a;CMake 保姆级教程 视频来自B站&#xff1a;CMake 保姆级教程C/C 1、快速操作&#xff1a; 原文来自&#xff1a;在 VScode 中使用 CMake 快速创建cpp工程 首先创建一个 C/C 工程文件夹 CALC&#xff0c;用 VSCode 打开&#xff0c;目录结构如下&#x…

探索软件工程师在新能源汽车研发中的角色与贡献

随着全球对可持续发展的关注不断增加&#xff0c;新能源汽车的研发与应用成为了汽车行业的一个重要方向。作为软件工程师&#xff0c;参与新能源汽车研发不仅能够推动科技创新&#xff0c;还能为环保事业贡献力量。本文将深入探讨软件工程师在新能源汽车研发中的具体贡献、所需…

如何画系统架构图学习

原文链接:https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E4%BB%8E%200%20%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84/51%20%E5%A6%82%E4%BD%95%E7%94%BB%E5%87%BA%E4%BC%98%E7%A7%80%E7%9A%84%E8%BD%AF%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%9B%BE%EF…

C语言学习系列:初识C语言

前言&#xff0c;C语言是什么 语言&#xff0c;比如中文、英语、法语、德语等&#xff0c;是人与人交流的工具。 C语言也是语言&#xff0c;不过是一种特殊的语言&#xff0c;是人与计算机交流的工具。 为什么叫C语言呢&#xff1f; 这就要从C语言的历史说起了。 一&#…

RAG vs Fine-Tuning 微调哪种大模型(LLM)技术更好?

数据科学和机器学习的研究人员和从业者都在不断探索创新策略来增强语言模型的能力。在众多方法中&#xff0c;出现了两种突出的技术&#xff0c;即检索增强生成 (RAG)和微调。本文旨在探讨模型性能的重要性以及 RAG 和微调策略的比较分析。 模型性能在 NLP 中的重要性 增强用…

[数据集][图像分类]黑色素瘤分类数据集10015张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;10015 分类类别数&#xff1a;7 类别名称:[“0”,“1”,“2”,“3”,“4”,…

Java学习 - MyBatis - 入门实例详解

前言 在上一篇文章中&#xff0c;我们讨论了持久化的概念&#xff0c;并简要介绍了 MyBatis。今天我们将深入到 MyBatis 的实际应用中&#xff0c;通过创建一个入门实例来展示如何使用 MyBatis 执行基本的 CRUD&#xff08;创建、读取、更新、删除&#xff09;操作。这个过程将…

demo xshell (程序替换 工作目录 内建命令)

1.程序替换 在学习完一些列的进程替换接口之后我们大概就能知道&#xff0c;我们的环境变量以及命令行参数是如何传递给子进程的&#xff0c;这些参数是我们在调用进程替换时就传给了子进程的数据。 那么如果我们自己要实现一个简单的命令行解释器&#xff0c;我们是不是首先…

记录某书请求返回406及响应{“code“:-1,“success“:false}

今天测试某个平台的爬虫时使用requests post请求正常写了个测试脚本把各种参数带上出来以后出现了406情况&#xff0c;和网站数据是完全一样的 以为是 X-S、X-T参接不对&#xff0c;但在postman里测试又是可以的成功&#xff0c;以为是检验了参数顺序&#xff0c;测试发现也没…

Ubuntu 24.04 LTS 安装配置 MySQL Community Server 8.4.0 LTS

1 安装 Apt Repository ​​​​​​​地址MySQL :: Download MySQL APT Repository sudo dpkg -i mysql-apt-config_0.8.30-1_all.deb #安装mysql 8.4 lts sudo apt update sudo apt-get install mysql-server #修改mysql root密码策略 2 查看版本 testtest:~$ mysqld --v…

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…

【内存管理】页表映射

页表的一些术语 现在Linux内核中支持四级页表的映射&#xff0c;我们先看下内核中关于页表的一些术语&#xff1a; 全局目录项&#xff0c;PGD&#xff08;Page Global Directory&#xff09; 上级目录项&#xff0c;PUD&#xff08;Page Upper Directory&#xff09; 中间目…

2024 AEE | 风丘科技将亮相日本爱知国际会展中心——共同创造!

2024年名古屋汽车工程博览会&#xff08;Automotive Engineering Exposition 2024 NAGOYA&#xff09;将于7月17-19日在日本爱知县国际展示场&#xff08;Aichi Sky Expo&#xff09;开展。本展会是专门为活跃在汽车行业的工程师和研究人员举办的汽车技术展览&#xff0c;汇聚了…

React保姆级教学

React保姆级教学 一、创建第一个react项目二、JSX基本语法与react基础知识1、 插值语法&#xff1a;2、 循环一个简单列表3、 实现简单条件渲染4、 实现复杂的条件渲染5、 事件绑定6、 基础组件&#xff08;函数组件&#xff09;7、 使用useState8、 基础样式控制9、 动态类名1…

ui自动化中,selenium进行元素定位,以及CSS,xpath定位总结

几种定位方式 简单代码 from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.common.by import Bydriver webdriver.Chrome() # 参数写浏览器驱动文件的路径&#xff0c;若配置到环境变量就不用写了 # 访问网址 driver.get…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

冯喜运:6.10周一黄金还会再次拉升吗?日内黄金原油操作策略

【黄金消息面分析】&#xff1a;周一(6月10日)亚市盘中&#xff0c;现货黄金交在上周五暴跌后仍然承压&#xff0c;目前金价位于2294美元/盎司左右。因强劲非农数据刺激美元大涨&#xff0c;现货黄金上周五出现暴跌。此外&#xff0c;上周五数据显示&#xff0c;最大黄金消费国…

Duck Bro的第512天创作纪念日

Tips&#xff1a;发布的文章将会展示至 里程碑专区 &#xff0c;也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作&#xff1f;2. 创作这些文章是为了赚钱吗&#xff1f…

基于运动控制卡的圆柱坐标机械臂设计

1 方案简介 介绍一种基于运动控制卡制作一款scara圆柱坐标的机械臂设计方案&#xff0c;该方案控制器用运动控制卡制作一台三轴机械臂&#xff0c;用于自动抓取和放料操作。 2 组成部分 该机械臂的组成部分有研华运动控制卡&#xff0c;触摸屏&#xff0c;三轴圆柱坐标的平面运…

MySQL时间和日期类型详解(零基础入门篇)

目录 1. DATE 2. DATETIME 3. TIMESTAMP 4. TIME 5. YEAR 6. 日期和时间的使用示例 以下SQL语句的测试可以使用命令行&#xff0c;或是使用SQL工具比如MySQL Workbench或SQLynx等。 在 MySQL 中&#xff0c;时间和日期数据类型用于存储与时间相关的数据&#xff0c;如何…