- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
一.最长递增子序列问题I
二.最长递增子序列问题II
三. 最长递增子序列问题III
1.对应牛客网链接
最长上升子序列(一)_牛客题霸_牛客网 (nowcoder.com)
2.题目描述:
3.解题思路
1.首先我们分析题意:最长递增子序列拆:要递增的,还是序列,不一定连续 ,要长度最长的。
2.子序列和子数组问题我们一般考虑必须以某个位置结尾如何如何,在本题中我们可以这样考虑必须以i位置结尾的情况下最长递增子序列的最大长度是多少我们每个位置都这么干那么答案一定就在其中
下面以[5,7,1,9,4,6,2,8,3]为例:
第一个元素 5: 递增长度只能为1, 接下来第二个7,比5大,长度为2
第三个元素 1:前面没有比它大的,只能为1 , 第四个元素9,前面有5,7,故长度为3到这里你发现,9比7大,7往前构成的长度是2,那9就可以接在7的后面,变成长度加一的新序列。
我相信老铁应该懂了
4.对应代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 给定数组的最长严格上升子序列的长度。
* @param arr int整型vector 给定的数组
* @return int整型
*/
int LIS(vector<int>& arr) {
if (arr.empty())
return 0;
// write code here
int N = arr.size();
vector<int>dp(N, 1);//每个位置最长递增子序列的长度至少为1自己本身就是
//dp的含义是必须以i位置结尾的情况下最长递增子序列的最大长度
int maxLen = 1;
for (int i = 1; i < N; i++) {
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
dp[i] = max(dp[i], dp[j] + 1); //长度加1
}
}
maxLen = max(maxLen, dp[i]);//更新最大长度
}
return maxLen;
}
};
1.对应牛客网链接:
最长上升子序列(二)_牛客题霸_牛客网 (nowcoder.com)
2.题目描述:
3.解题思路:
1.在这里我们引入end数组,end[i]的值为最目前为止长度为i+1的最小结尾
2.每次去end数组里面去找大于等于arr[i]最左的位置
我们看同样是长度为2的子序列,[2,3]就比[2,5]好。因为[2,3]后面如果有4的话,组成[2,3,4]长度就是3了,但是[2,5]因为不满足条件,就没法组队了。
我们组成子序列的时候,不仅要让这个序列尽可能的长,而且要让子序列中的上升的时候尽可能的缓慢,[2,3]就比[2,5]上升的缓慢,这样就有机会能拼接出更长的上升子序列。我们用一个数组来保存当前的最长上升子序列,这个数组是严格递增的。
因为是严格递增的,数组中最后一个值nums[max]就是最大值,如果下次再碰到一个数字n,它比num[max]还要大,那么很明显,这个子序列的长度就要+1,并且将数组n添加到数组的末尾。
[2,3,7,8,11,13,18]是目前为止最长的上升子序列,之后如果又碰到了19,或者101,因为他们都大于数组中的最大值18,所以直接将其添加到数组末尾就可以了,同时子序列的长度要+1。19和101的例子很好理解,但如果下次碰到的数字是6或者12呢?因为要让子序列上升的尽可能缓慢,那么让[2,5,7...]变成[2,5,6...]更合适,因为后者上升的更缓慢。同样,将[...8,11,13,18]变成[...8,11,12,18]也是上升的更缓慢一点。
也就是,已知上升子序列[i,i_1,i_2,....,i_n],现在我们在继续遍历的过程中碰到了一个值i_k,这个值是小于i_n的,所以上升子序列的长度还是不变。但是我们需要找到一个位置,将i_k替换掉某个旧的值。
对应动图:
4.对应代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 该数组最长严格上升子序列的长度
* @param a int整型vector 给定的数组
* @return int整型
*/
int LIS(vector<int>& arr) {
// write code here
if (arr.empty()) {
return 0;
}
int N = arr.size();
vector<int>end(N);
//end[i]的含义是目前为止长度为i+1的最小结尾
end[0] = arr[0];
int L = 0;
int maxLen = 1;
int right = 0; //用于控制end数组的范围
int R = right;
for (int i = 1; i < N; i++) {
L = 0;
R = right;
while (L <= R) {//用于查找大于等于arr[i]最左边的位置
int mid = (L + R) >> 1;
if (arr[i] > end[mid]) {
L = mid + 1;
} else {
R = mid - 1;
}
}
right = max(right, L); //更新右边界
maxLen = max(maxLen, L + 1);
end[L] = arr[i];
}
return maxLen;
}
};
1.对应letecode链接:
最长上升子序列(三)_牛客题霸_牛客网 (nowcoder.com)
2.题目描述:
3.解题思路
1.本题只是上题的一个升级版我们只需要定义一个变量记录 一下最长递增子序列的结尾位置在哪里即可,然后再依次遍历
4.对应代码:
class Solution {
public:
/**
* retrun the longest increasing subsequence
* @param arr int整型vector the array
* @return int整型vector
*/
vector<int> LIS(vector<int>& arr) {
// write code here
if (arr.empty()) {
return {};
}
int N = arr.size();
vector<int>dp(N, 1);
vector<int>end(N);
int maxLen = 1;
int maxIndex = 0;
end[0] = arr[0];
int right = 0;
int L = 0;
int R = right;
for (int i = 1; i < N; i++) {
L = 0;
R = right;
while (L <= R) {
int mid = (L + R) >> 1;
if (arr[i] > end[mid]) {
L = mid + 1;
} else {
R = mid - 1;
}
}
right = max(right, L);
maxLen = max(maxLen, L + 1);
end[L] = arr[i];
dp[i] = L + 1;
if (dp[i] >= maxLen) {//由于要求子典序最小
maxIndex = i;
maxLen = dp[i];
}
}
vector<int>ans(maxLen);//获取最长的递增子序列
for (int i = maxIndex; i >= 0; i--) {
if (dp[i] == maxLen) {
ans[--maxLen] = arr[i];
}
}
return ans;
}
};
思考题:如果要获取所有递增子序列了?
#include<iostream>
#include<vector>
using namespace std;
vector<int> process(vector<int>& arr,vector<int>&dp ,int maxLen, int index) {//获取所有最长递增子序列
vector<int>ans(maxLen);
for (int i = index; i >= 0; i--) {
if (dp[i] == maxLen) {
ans[--maxLen] = arr[i];
}
}
cout << "进来" << endl;
return ans;
}
int main() {
int N;
cin >> N;
vector<int>arr(N);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
vector<int>dp(N, 1);
vector<int>end(N);
int maxLen = 1;
int maxIndex = 0;
end[0] = arr[0];
int right = 0;
int L = 0;
int R = right;
for (int i = 1; i < N; i++) {
L = 0;
R = right;
while (L <= R) {
int mid = (L + R) >> 1;
if (arr[i] > end[mid]) {
L = mid + 1;
}
else {
R = mid - 1;
}
}
right = max(right, L);
maxLen = max(maxLen, L + 1);
end[L] = arr[i];
dp[i] = L + 1;
if (dp[i] >= maxLen) {
maxIndex = i;
maxLen = dp[i];
}
}
vector<vector<int>>ans;
for (int i = 0; i < N; i++) {
if (dp[i] == maxLen) {
ans.push_back(process(arr, dp, maxLen, i));
}
}
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[0].size(); j++) {
cout << ans[i][j] << " ";
}
cout << endl;
}
return 0;
}
我有这个 html 代码: HELLO WORLD! X V HELLO WORLD! X V 我想按 X(类关闭)将父 div 的高度更改为 20px 并显示 V(类打开),但在每个 d
在会计应用程序的许多不同实现中,有两种主要的数据库设计方法来保存日志和分类帐数据。 只保留 Journal 信息,然后 Ledger 只是 Journal 的一个 View (因为 journal 总
我想在另一个子里面有一个子, sub a { sub b { } } 我想为每次调用 sub b 创建一个新的 sub a 实例。有没有办法在 Perl 中做到这一点? 当我运行上面的
我有一些代码正在查找重复项并突出显示单元格: Private Sub cmdDups_Click() Dim Rng As Range Dim cel As Range Set Rng = ThisW
可能有一个简单的解决方案,但我很难过。 我有一个包含一个 ID 字段的主表。在两个可能的字段中有一个具有该 ID 的子表。想象一个由选手 A 和选手 B 组成的 double 队。Master 表将有
假设我有一个包含对象的数组: [ { "id": "5a97e047f826a0111b754beb", "name": "Hogwarts", "parentId": "
我正在尝试对 MySQL 数据库表执行一对父/子模型的批量插入,但似乎无法使用标准的 ActiveRecord 功能来完成。所以,我尝试了 activerecord-import gem,但它也不支持
我有一个带有多个子类的父抽象类。最终,我希望通过 GUI 中的进度条显示子类中完成的进度。 我目前所做的,我意识到这是行不通的,是在父类中声明为每个子类将覆盖的虚拟方法的事件方法定义。所以像: pub
是否可以通过键数组在对象中设置变量?例如我有这个对象: var obj = {'outer': {'inner': 'value'} }; 并希望设置由键数组选择的值: var keys = ['ou
我有一个名为 companies 的 MySQL 表,如下所示: +---------+-----------+-----------+ | id_comp | comp_name | id_pare
我正在尝试使用 sublime text 在 sublime text 上的 ionic 上打开我的第一个应用程序。它给了我一个“找不到命令”的错误。如何修复? 我试过这些命令: sudo rm -r
不好意思问,但我正在使用 webapp2,我正在设计一个解决方案,以便更容易定义路由 based on this google webapp2 route function .但这完全取决于能够在子级
我有代表树的数字字符串(我不知道是否有官方名称): 012323301212 上面的例子代表了 2 棵树。根用 0 表示。根的直接子代为“1”,“1”的直接子代为“2”,依此类推。我需要将它们分组到由
是否可以在当前 Activity 之上添加 Activity 。例如,假设我单击一个按钮,然后它将第二个 Activity 添加到当前 Activity 。而第二个 Activity 只覆盖了我当前
我很难思考如何为子资源建模。 以作者的书籍为例。你可以有 N 本书,每本书只有一位作者。 /books GET /books POST /books/id PUT /books/id DELETE 到
有人可以向我解释以下内容(python 2.7) 来自已解析文件的两个字符串数字: '410.9''410.9 '(注意尾随空格) A_LIST = ['410.9 '] '410.9' in '41
背景 在 PowerShell 中构建 hash table 是很常见的通过特定属性快速访问对象,例如以 LastName 为基础建立索引: $List = ConvertFrom-Csv @' I
我真的很难弄清楚如何调用嵌套 Polymer Web 组件的函数。 这是标记: rise-distribution组件有 canPlay我想从 rise-playlist
我写了一个小工具转储(以 dot 格式)一个项目的依赖关系图,其中所有位于同一目录中的文件都聚集在一个集群中。当我尝试生成包含相应图形的 pdf 时,dot开始哭: 命令 dot -Tpdf trim
给定一个 CODE ref,是否可以: 访问该 CODE ref 的解析树 通过指定 CODE ref 的解析树来创建一个新的 CODE ref,该解析树可以包含在 1 中返回的解析树的元素 通常我们
我是一名优秀的程序员,十分优秀!