刷题日记1

news2024/11/15 22:57:54

最近在用JavaScript刷动态规划的题组,刷了一半感觉只刷题不写笔记的话印象没那么深刻,所以从今天开始来记录一下刷题情况。

力扣T300 300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

这道题的思路是:

判断以第i个元素为结尾的最长子序列的长度

dp【i】的含义是以第i个元素为结尾的最长子序列的长度

在动态规划过程中,我们依次遍历每个元素,在遍历当前元素时,让该元素与之之前的每个元素大小作比较,如果nums【i】元素大于nums【j】元素,说明nums【i】可以在已经以nums【j】为结尾的最长子序列基础上接上去构成+1大小的最长子序列。并且在内循环遍历过程中要不断和自身dp【i】做比较看是否需要更新最长子序列长度。

遍历完一个元素的情况之后要更新当前获取的最长子序列长度

/**
 * @param {number[]} nums
 * @return {number}
 */
var lengthOfLIS = function(nums) {
    let n=nums.length
    let res=0
    let dp=new Array(n).fill(1)
    for(let i=0;i<n;i++){
        for(let j=0;j<i;j++){
            if(nums[j]<nums[i])dp[i]=Math.max(dp[i],dp[j]+1)
        }
        res=Math.max(res,dp[i])
    }
    return res//更新当前获取的最长子序列长度
};

在此题的基础上,变化一下要求,要求获得的不是最长递增子序列的长度,而是该长度的子序列的个数,就变成了下面这道题:

力扣T673 l673. 最长递增子序列的个数

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

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

在上一题的基础上,这题需要增加一个记录以每个元素为结尾的最长子序列的个数数组cnt

在每轮遍历更新最大值时,要随后更新对应的个数。

注意初始化数组dp和cnt时需要赋初值为1

因为对于每个元素本身,dp【i】和cnt【i】最少为1

相对上一道题,这里需要考虑更新最大值时,dp【i】=dp【j】+1的情况

如果dp【i】<dp【j】+1,可以放心大胆的换新的dp和cnt

但 如果等于时,相当于不影响最长值但有同样长度效果的另一种情况,所以要加上这种情况的个数

在每次遍历完当前元素更新最大值时,也需要进行这样的判断才不会漏掉情况。

/**
 * @param {number[]} nums
 * @return {number}
 */
var findNumberOfLIS = function(nums) {
    let n=nums.length//数组长度
    let res=0//最大长度
    let ans=0//最终结果
    let cnt=new Array(n).fill(1)//记录以第【i】个元素结尾的最长递增子序列数
    let dp=new Array(n).fill(1)//记录以第【i】个元素结尾的最长递增子序列长度
    for(let i=0;i<n;i++){
        for(let j=0;j<i;j++){
            if(nums[j]<nums[i])//如果可以追加到nums[j]后,才有后面的情况可言
            {
                if(dp[j]+1>dp[i])//获得了更长的情况,最长值变化,最长值序列数量也变化了,变成了cnt【j】的数量
                {
                    dp[i]=dp[j]+1;
                    cnt[i]=cnt[j]
                }else if(dp[j]+1===dp[i])//如果加不加在nums【j】后和最长长度一样,那要把这个长度的情况条数也加上
                {
                    cnt[i]+=cnt[j];
                }
            }
        }
        if(dp[i]>res)//更新了最长值,最终结果也要以新的最长值为准
        {
            res=dp[i];
            ans=cnt[i];
        }else if(dp[i]===res)//也等于最长值,要加上这种情况的个数
        {
            ans+=cnt[i]
        }  
    }
    return ans;
};

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

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

相关文章

超实用!了解github的热门趋势和star排行是必须得!

在当今的技术领域中&#xff0c;GitHub 已经成为了开发者们分享和探索代码的重要平台。作为全球最大的开源社区&#xff0c;GitHub上托管了数以亿计的项目&#xff0c;其中包括了各种各样的技术栈和应用。对于开发者来说&#xff0c;了解GitHub上的热门趋势和star排行是非常重要…

Java10年技术架构演进

一、前言 又快到了1024&#xff0c;现代人都喜欢以日期的特殊含义来纪念属于自己的节日。虽然有点牵强&#xff0c;但是做件事情&#xff0c;中国人总喜欢找个节日来纪念&#xff0c;程序员也是一样。甚至连1111被定义成光棍节&#xff0c;这也算再无聊不过了。不过作为程序员…

基于百度API的车牌识别计费系统

1&#xff0c;车牌识别API 介绍&#xff1a; 百度车牌识别API是一款基于人工智能算法的车牌识别服务&#xff0c;可以识别包括普通车牌、新能源车牌在内的多种车牌类型&#xff0c;并支持高精度的识别结果输出。其主要功能特点包括&#xff1a; 普通车牌和新能源车牌的识别&a…

首发AI原生应用开发平台——千帆AI原生应用开发工作台,加速企业AI应用落地

为了满足企业对于敏捷和高效地进行AI原生应用开发与运维的需求&#xff0c;并降低相关开发的门槛&#xff0c;百度智能云最新发布了“千帆AI原生应用开发工作台”。该工作台将开发大型模型应用程序的常见模式、工具和流程进行了整合&#xff0c;使得开发者可以聚焦于自身业务&a…

深度学习 | Pytorch深度学习实践

一、overview 基于pytorch的深度学习的四个步骤基本如下&#xff1a; 二、线性模型 Linear Model 基本概念 数据集分为测试集和训练集&#xff08;训练集、开发集&#xff09;训练集&#xff08;x&#xff0c;y&#xff09;测试集只给&#xff08;x&#xff09;过拟合&#xf…

【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)

一&#xff0c;资源下载准备 1-1 VMware 16.0 安装请参考以下博客&#xff0c;若已经安装请忽略&#xff1a; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;…

IPIDEA代理IP如何帮助企业采集市场信息

在当今数字化的时代&#xff0c;市场信息对于企业的发展至关重要。然而&#xff0c;如何高效地收集市场信息成为了每个企业都需要面对的问题。爬虫技术的出现为企业提供了一种高效、便捷的信息采集方式。然而&#xff0c;由于爬虫的请求频率较高&#xff0c;目标网站可能会将频…

Linux | gcc/g++的使用

目录 前言 一、程序的翻译过程 1、预编译 2、编译 3、汇编 4、链接 &#xff08;1&#xff09;链接做了什么 &#xff08;2&#xff09;动态链接 &#xff08;3&#xff09;静态链接 &#xff08;4&#xff09;如何使用gcc进行动态链接和静态链接 前言 本章主要带着大…

【实战】学习 Electron:构建跨平台桌面应用

文章目录 一、Electron 简介二、Electron 的优势1. 学习曲线平缓2. 丰富的生态系统3. 跨平台支持4. 开源和社区支持 三、Electron 的使用1. 安装 Node.js2. 安装 Electron3. 创建项目4. 初始化项目5. 安装依赖6. 创建主进程文件7. 创建渲染进程文件8. 打包应用程序9. 运行应用程…

【AI视野·今日NLP 自然语言处理论文速览 第五十六期】Tue, 17 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 17 Oct 2023 (showing first 100 of 135 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Step-by-Step Remediation of Students Mathematical Mistakes Authors…

泛微e-office json_common.php SQL注入漏洞

一、漏洞描述 泛微e-office为企业办公提供丰富应用&#xff0c;覆盖常见协作场景&#xff0c;开箱即用。满足人事、行政、财务、销售、运营、市场等不同部门协作需求&#xff0c;帮助组织高效管事理人。 系统 json_common.php 文件存在SQL注入漏洞 二、网络空间搜索引擎搜索 …

【前端学习】—Vuex(十八)

【前端学习】—Vuex&#xff08;十八&#xff09; 一、Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。

虚拟机zeppelin安装

一、解压 tar -zxvf ./zeppelin-0.10.0-bin-all.tgz -C /opt/soft/ 二、改名字 mv ./zeppelin-0.10.0-bin-all.tgz zeppelin010 三、配置/etc/profile #ZEPPELIN export ZEPPELIN_HOME/opt/soft/zeppelin010 export PATH$ZEPPELIN_HOME/bin:$PATH source /etc/profile 四…

Vue笔记_插件组件_lucky-canvas抽奖转盘

文章目录 官网使用(vue2.x)[1] 下载[2] 引入[3] 使用配置项-width/height配置项-blocks配置项-prizes配置项-buttons优化案例 lucky-canvas 是一个基于 Js Canvas 的抽奖 web 前端组件&#xff0c;提供 大转盘和 九宫格两种抽奖界面&#xff0c;UI 精美&#xff0c;功能强大…

Linux创建与删除用户

Linux创建与删除用户 新增用户&#xff1a; adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户&#xff1a; userdel -r 用户名【删除用户】

C++QT---QT-day2

/*使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c; 在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

THE PLANETS:EARTH vulnhub

信息收集 netdiscover -i eth0 -r 192.168.239.0&#xff0c;扫描存活主机&#xff0c;发现目标主机 对目标主机进行端口扫描&#xff1a;nmap -p- -sV -O -Pn -A 192.168.239.186&#xff0c;发现443端口存在DNS&#xff0c;域名 在本地得/etc/hosts中添加域名信息 浏览…

地垫/毛绒地毯/地毯GCC认证测试项目介绍

出口美国地垫GCC清关认证 美国联邦法律规定&#xff0c;地毯和垫子要符合易燃性标准和其它要求&#xff0c; 包括2008年《美国消费品安全改进法》的要求。 在地毯和垫子经过检测或合理检测项目后&#xff0c;作为一般用途的 地毯和垫子的生产商和进口商必须在一般合规证书&…

在 Python 中如何向列表或数组添加元素

在这篇文章中&#xff0c;你将了解 Python 中的 .append() 方法。你还会看到 .append() 与其他用于向列表添加元素的方法有什么不同。 让我们开始吧&#xff01; Python 中的列表是什么&#xff1f;给初学者的定义 编程中的数组是一个有序的项目集合&#xff0c;所有的项目都…

开关电源EMC整改案例-辐射骚扰

1. 测试结果 产品 Coconut1首次 EMC 测试时&#xff0c;辐射、静电、浪涌均失败。本篇先讨论辐射超标. 1.1 辐射超标 50MHz 、100MHz 、130MHz 、200MHz &#xff0c;4 个频点明显超标&#xff0c;其中 130MHz 左右最明显&#xff0c; 超出 19dB&#xff1b;后将电路板仅…