LeetCode刷题 | Day 2 最长严格递增或递减子列表(Longest Increasing or Decreasing SubList)

本文主要是介绍LeetCode刷题 | Day 2 最长严格递增或递减子列表(Longest Increasing or Decreasing SubList),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode刷题 | Day 2 最长严格递增或递减子列表(Longest Increasing Decreasing SubList)


文章目录

  • LeetCode刷题 | Day 2 最长严格递增或递减子列表(Longest Increasing Decreasing SubList)
  • 前言
  • 一、题目概述
  • 二、解题方法
    • 2.1 动态规划思想
      • 2.1.1 思路讲解
      • 2.1.2 伪代码 + 逐步输出示例
      • 2.1.3 Python代码如下
      • 2.1.4 C++代码如下
  • 三、英语词汇


前言

LeetCode位置:3105. 最长的严格递增或递减子数组

日常刷题,维持手感,同步学习英语,刷题顺序参考B站UP@justyyuk的系列视频,感兴趣的点波关注。
学海无涯,大路千万,感恩此程,彼此真诚陪伴!
在这里插入图片描述
Ps:第一次刷到的道友留步,这里拉齐一下信息。文章主要记录视频中的主要内容,算法思路会按照个人理解,用伪代码+举例每步输出的方式呈现。代码部分会以Python和C++语法进行呈现。文章最后会总结一些英语词汇。OK,就啰嗦这么多,开始进步[干杯🐱‍👓]


一、题目概述

本题与UP主justyyuk的题目不同(UP主题目:最长严格递增然后递减子列表),但解题思路类似(最后一步不同),故这里以LeetCode为主。
Day2题目

输入:nums列表
输出:最长严格递增然后递减子列表长度

PS:

  1. 子序列 (Subsequence):

    • 子序列是通过从原始序列中删除一些或不删除任何元素且不改变剩余元素顺序而得到的序列。
    • 例子:对于序列 [1, 2, 3, 4],[1, 3, 4] 和 [2, 4] 是子序列。
    • 注意:[1, 4, 3] 不是 子序列,因为顺序改变了。
  2. 子列表 (Sublist)

    • 子列表是列表的连续部分,意味着元素必须是连续的。
    • 例子:对于列表 [1, 2, 3, 4],[2, 3] 和 [1, 2, 3]是子列表。
    • 注意:[1, 3] 不是 子列表,因为它不是连续的。
  3. 子数组 (Subarray):

    • 类似于子列表,子数组是数组的连续部分。
    • 例子:对于数组 [1, 2, 3, 4],[2, 3] 和 [1, 2, 3] 是子数组。
    • 注意:[1, 3] 不是 子数组,因为它不是连续的。
  • 在许多情况下,当数据结构是数组或列表时,“子列表”和“子数组”可以互换使用,但“子数组”一词专门用于数组。

二、解题方法

2.1 动态规划思想

2.1.1 思路讲解

Ps: 动态规划(Dynamic Programming)特征
- 最优子结构:
- 动态规划要求问题具有最优子结构性质,即问题的最优解包含其子问题的最优解。
- 重叠子问题:
- 动态规划需要问题具有重叠子问题性质,即不同的子问题在求解时会重复出现。
- 状态转移方程:
- 动态规划通过状态转移方程将问题分解为子问题,并通过子问题的解来推导原问题的解。
- 全局最优解:
- 动态规划通过考察所有可能的子问题组合来确保找到全局最优解。
- 记忆化或表格法:
- 动态规划通常使用记忆化搜索或自底向上的表格法来避免重复计算。

  • 动态规划策略

    • 分别计算数组中每个位置的单调递增和单调递减子数组的长度,最终得到最长单调子数组的长度。
  • 具体步骤

    • 使用两个数组 inc 和 dec,分别存储每个位置上最长单调递增和单调递减子数组的长度,初始值均为 1。
    • 从前往后遍历 nums 数组,若当前元素大于前一个元素,则当前位置的递增长度等于前一个位置的递增长度加一。
    • 从后往前遍历 nums 数组,若当前元素大于后一个元素,则当前位置的递减长度等于后一个位置的递减长度加一。
    • 最终结果为 inc 和 dec 两个数组中的最大值,即最长的单调子数组长度。

2.1.2 伪代码 + 逐步输出示例

# 伪代码示例
函数 longestMonotonicSubarray(nums):n = nums 的长度初始化 inc 数组为 [1] * n初始化 dec 数组为 [1] * n对于 i 从 1 到 n-1:如果 nums[i] > nums[i-1]:inc[i] = inc[i-1] + 1对于 i 从 n-20:如果 nums[i] > nums[i+1]:dec[i] = dec[i+1] + 1ans = inc 和 dec 数组中的最大值返回 ans# 逐步输出示例
输入: nums = [1, 2, 2, 3, 2, 1, 4]
步骤:
1. n = 7
2. 初始化 inc 数组为 [1, 1, 1, 1, 1, 1, 1]
3. 初始化 dec 数组为 [1, 1, 1, 1, 1, 1

这篇关于LeetCode刷题 | Day 2 最长严格递增或递减子列表(Longest Increasing or Decreasing SubList)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030493

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ