【LeetCode: 673. 最长递增子序列的个数 | 动态规划】

news/2024/11/29 23:34:48/

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚗 知识回顾
    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚗 知识回顾

大家再看这道题目之前,可以先去看一下我之前写过的一篇关于最长递增子序列算法题的博客,再看这个题目就更容易理解了。
博客的地址放到这里了,可以先去学习一下这到题目。

  • 【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】
  • 【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】

🚩 题目链接

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

⛲ 题目描述

给定一个未排序的整数数组 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

🌟 求解思路&实现代码&运行结果


⚡ 动态规划

🥦 求解思路

  1. 核心的求解思路我们之前都讲过了,此处就不做过多的讲解了,如果还有问题的同学可以看一下我之前的文章先进行学习,否则还是比较难理解的。
  • 【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】
  • 【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】
  1. 这道题目呢其实又是一道最长递增子序列的变种题目,这道题目让我们去求最长递增子序列的个数。
  2. 怎么求这个最长递增子序列的个数呢?因为我们之前通过dp求得的是以某一个位置结尾的最长递增子序列的长度,现在有要求个数,所以我们还需要维护一个以某一个位置结尾的最长上升子序列的个数。
  3. 具体我们该怎么维护这个状态呢?和之前动态规划的思路一样,此时我们需要做这样一个判断,1.如果之前的某一个位置j对应的长度+1是大于我们以i位置结尾的长度,那么此时更新位置对应为最大的长度,并且更新此时i位置结束的最长上升子序列的个数为j位置对应的结果;2. 如果之前的某一个位置j对应的长度+1是等于我们以i位置结尾的长度,此时我们i位置结束的最长上升子序列的个数加上j位置对应的结果即可。
  4. 有了基本的思路+前面题目的讲解,我们再来看这道题目就会感觉非常容易了,接下来我们一起来看具体代码的实现过程。

🥦 实现代码

class Solution {public int findNumberOfLIS(int[] nums) {int n=nums.length;int[] dp=new int[n];int[] len=new int[n];Arrays.fill(dp,1);Arrays.fill(len,1);int max=1;for(int i=0;i<nums.length;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]){if(dp[j]+1>dp[i]){dp[i]=dp[j]+1;len[i]=len[j];}else if(dp[j]+1==dp[i]){len[i]+=len[j];}}}max=Math.max(max,dp[i]);}int cnt=0;for(int i=0;i<dp.length;i++){if(dp[i]==max) cnt+=len[i];}return cnt;}
}

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/47746.html

相关文章

《面试1v1》HashMap

没有人比中国人更懂 HashMap 我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a;HashMap 是Java程序员用得最频繁的集合之一,可以给我简单介绍一下它的内部实现机制吗? 候选人&#xff1a; Hash…

华为OD机试真题(Java),数组合并(100%通过+复盘思路)

一、题目描述 现在有多组整数数组&#xff0c;需要将他们合并成一个新的数组。 合并规则从每个数组里按顺序取出固定长度的内容&#xff0c;合并到新的数组&#xff0c;取完的内容会删除掉。 如果改行不足固定长度&#xff0c;或者已经为空&#xff0c;则直接取出剩余部分的内…

Axios请求(对ajax的二次封装)——Axios API、Axios实例、请求配置、Axios响应结构

axios起步——介绍和使用基本用例post请求 场景复现核心干货axios APIaxios(config)axios(url[,config])请求方式别名 axios实例创建一个axios实例axios.create([config])实例方法 axios请求配置axios响应结构 场景复现 最近学习与前端相关的小程序时&#xff0c;接触了异步请…

@爱打游戏的你,当游戏测试是什么感觉?

爱打游戏的你&#xff0c;当游戏测试是一种什么感觉&#xff1f; 去年《宝可梦朱紫》大火的那段时间&#xff0c;想必各位爱好游戏的友友们都刷到过这样的图吧&#xff1a; &#xff08;量子纠缠&#xff09; &#xff08;天怎么黑了&#xff09; &#xff08;弹簧巨怪&#x…

4-数据结构

数据结构&#xff08;data structure&#xff09; 1. 简介 数据结构是在计算机中组织与存储数据的方式 如果想要表示“一排数字”&#xff0c;自然想到使用「数组」数据结构 数组的存储方式可以表示数字的相邻关系、顺序关系&#xff0c;但至于其中存储的是整数int&#xff0c…

Python并发编程在爬虫中的应用

并发编程在爬虫中的应用 本文将为大家介绍 Python 中的多线程、多进程和异步编程&#xff0c;并且以爬取“360图片”网站的图片并保存到本地为例&#xff0c;为大家分别展示使用单线程、多线程和异步 I/O 编程的爬虫程序有什么区别&#xff0c;同时也对它们的执行效率进行简单…

非计算机专业如何转行成为程序员?我用亲身经历教你用这三种方法

哈喽大家好啊&#xff01;我想分享一下&#xff0c;非计算机专业的学生如何转行成为程序员。首先&#xff0c;我先介绍一下我的情况。我是18年毕业的&#xff0c;大学学的专业是土木工程&#xff0c;与计算机一点关系都没有。但是在大学时&#xff0c;我对程序员比较感兴趣。本…

(包教包会)最强分布式锁工具:Redisson

今天来聊聊分布式锁的最强实现&#xff1a;Redisson 从分布式锁到Redisson实现非常详细&#xff0c;适合慢慢咀嚼~ 一. Redisson概述 1.1 什么是Redisson&#xff1f; Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。…