LeetCode刷题 | Day 1 最大子序列求和(Largest K Subsequence Sum)
文章目录
- LeetCode刷题 | Day 1 最大子序列求和(Largest K Subsequence Sum)
- 前言
- 一、题目概述
- 二、解题方法
-
- 2.1 贪心思路
-
- 2.1.1 思路讲解
- 2.1.2 伪代码 + 逐步输出示例
- 2.1.3 Python代码如下
- 2.1.4 C++代码如下
- 2.2 贪心和滑窗思路
-
- 2.2.1 思路讲解
- 2.2.2 伪代码 + 逐步输出示例
- 2.2.3 Python代码如下
- 2.2.4 C++代码如下
- 三、英语词汇
前言
LeetCode位置:2099. 找到和最大的长度为 K 的子序列
日常刷题,维持手感,同步学习英语,刷题顺序参考B站UP@justyyuk的系列视频,感兴趣的点波关注。
学海无涯,大路千万,感恩此程,彼此真诚陪伴!
Ps:第一次刷到的道友留步,这里拉齐一下信息。文章主要记录视频中的主要内容,算法思路会按照个人理解,用伪代码+举例每步输出的方式呈现。代码部分会以Python和C++语法进行呈现。文章最后会总结一些英语词汇。OK,就啰嗦这么多,开始进步[干杯🐱👓]
一、题目概述
输入:nums列表和子序列长度k
输出:和最大的长度为k的子序列
PS:
子序列 (Subsequence):
- 子序列是通过从原始序列中删除一些或不删除任何元素且不改变剩余元素顺序而得到的序列。
- 例子:对于序列 [1, 2, 3, 4],[1, 3, 4] 和 [2, 4] 是子序列。
- 注意:[1, 4, 3] 不是 子序列,因为顺序改变了。
子列表 (Sublist)
- 子列表是列表的连续部分,意味着元素必须是连续的。
- 例子:对于列表 [1, 2, 3, 4],[2, 3] 和 [1, 2, 3]是子列表。
- 注意:[1, 3] 不是 子列表,因为它不是连续的。
子数组 (Subarray):
- 类似于子列表,子数组是数组的连续部分。
- 例子:对于数组 [1, 2, 3, 4],[2, 3] 和 [1, 2, 3] 是子数组。
- 注意:[1, 3] 不是 子数组,因为它不是连续的。
- 在许多情况下,当数据结构是数组或列表时,“子列表”和“子数组”可以互换使用,但“子数组”一词专门用于数组。
二、解题方法
2.1 贪心思路
2.1.1 思路讲解
Ps:
贪心算法的特征
- 局部最优解:每一步都选择当前最优的元素(即最大的k个元素)。
- 全局最优解:通过局部最优解的选择,最终获得问题的全局最优解(即总和最大的子序列)。
贪心策略
- 选择局部最优解:为了使子序列的总和最大,我们选择nums中最大的k个元素。
- 保证相对顺序:尽管我们选择了最大的k个元素,我们仍需保证它们在原序列中的相对顺序。
具体步骤
- 排序选择:我们对nums进行排序并选择最大的k个元素。
- 保持顺序:选出最大的k个元素后,我们需要按原序列的索引排序,以保持它们的相对顺序。
2.1.2 伪代码 + 逐步输出示例
# 伪代码示例
函数 maxSubsequence(nums, k):
断言 k > 0 并且 k <= nums 的长度
将 nums 转换为带有索引的列表 arr
按数值对 arr 进行排序
取 arr 中最大的 k 个元素的索引 idx
对 idx 进行排序
返回 nums 中对应 idx 的元素
# 逐步输出示例
输入: nums = [3, 5, 2, 9, 8], k = 3
步骤:
1. 验证 k 的合法性: k > 0 并且 k <= 5
2. arr = [(0, 3), (1, 5), (2, 2), (3, 9), (4, 8)]
3. arr 排序后: [(2, 2), (0, 3), (1, 5