leetcode 300. Longest Increasing Subsequence
来源:互联网 发布:挖财入职期权 知乎 编辑:程序博客网 时间:2024/06/06 10:53
方法一:动态规划
class Solution {
public:int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
vector<int> result(nums.size(), 1);
int max_num = 1;
for (int i = nums.size() - 2; i >= 0; i--) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] < nums[j] && result[i] < result[j] + 1) {
result[i] = result[j] + 1;
}
}
if (result[i] > max_num) {
max_num = result[i];
}
}
return max_num;
}
};
方法二:
借助result数组,每次更新result数组。即:result数组维护从小到大的序列,遍历nums数据的时候,如果有值小于result数组中的值,则进行更新。
以[10, 9, 2, 5, 3, 1,7, 101, 18]为例,result数组的变化情况如下:
1)10
2)9
3)2
4)2, 5
5)2, 3
6)1, 3
7)1, 3, 7
8)1, 3, 7,101
9)1, 3, 7, 18
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
vector<int> result(nums.size() + 1, INT_MIN);
int max_num = 0;
for (int i = 0; i < nums.size(); i++) {
int target_idx = INT_MIN;
for (int j = max_num; j >= 0; j--) {
if (nums[i] > result[j]) {
target_idx = j;
break;
}
}
if (target_idx == max_num) {
max_num++;
result[max_num] = nums[i];
} else if (target_idx != INT_MIN) {
if (nums[i] < result[target_idx + 1]) {
result[target_idx + 1] = nums[i];
}
}
}
return max_num;
}
};
方法三:方法二的优化,查找数据时不用for循环,而是二分查找
class Solution {
public:
int binsearch (vector<int> result, int begin, int end, int target) {
if (begin > end) {
return -1;
}
if (begin == end) {
if (result[begin] > target) {
return begin;
} else {
return -1;
}
}
int mid = begin + (end - begin)/2 + 1;
if (mid - 1 < begin) {
return -1;
}
if (result[mid] == target) {
return -1;
} else if (result[mid] > target) {
if (result[mid - 1] < target) {
return mid;
} else {
return binsearch(result, begin, mid - 1, target);
}
} else {
if (mid + 1 > end) {
return -1;
} else {
return binsearch(result, mid + 1, end, target);
}
}
}
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
vector<int> result(nums.size(), INT_MIN);
int max_num = 0;
result[0] = nums[0];
for (int i = 0; i < nums.size(); i++) {
int idx = binsearch(result, 0, max_num, nums[i]);
if (idx == -1) {
if (result[max_num] < nums[i]) {
max_num++;
result[max_num] = nums[i];
}
} else {
result[idx] = nums[i];
}
}
return max_num + 1;
}
};
- Leetcode-300.Longest Increasing Subsequence
- 300. Longest Increasing Subsequence LeetCode
- [leetcode] 300. Longest Increasing Subsequence
- leetcode 300. Longest Increasing Subsequence
- LeetCode *** 300. Longest Increasing Subsequence
- LeetCode 300. Longest Increasing Subsequence
- LeetCode-300.Longest Increasing Subsequence
- [leetcode] 300. Longest Increasing Subsequence
- leetcode 300. Longest Increasing Subsequence
- LeetCode 300. Longest Increasing Subsequence
- leetcode 300. Longest Increasing Subsequence
- [LeetCode]--300. Longest Increasing Subsequence
- [leetcode] 300. Longest Increasing Subsequence
- LeetCode 300. Longest Increasing Subsequence
- 【LeetCode】300. Longest Increasing Subsequence
- 【LeetCode】300. Longest Increasing Subsequence
- Leetcode 300. Longest Increasing Subsequence
- 【LeetCode】300. Longest Increasing Subsequence
- AS Bug:Error:failed to find Build Tools revision 24.0.0 rc1
- JavaScript鼠标拖动
- 反射
- 开发App常见的九大错误
- 【Unity3D插件】NGUI基础学习笔记
- leetcode 300. Longest Increasing Subsequence
- SelectObject 函数详解
- Android单元测试
- Listview的优化与复用
- SQL SERVER datetime 操作
- 从网易与淘宝的font-size思考前端设计稿与工作流
- 一个月的工作总结
- MySQL数据库优化(五)——MySQL查询优化
- 深入理解Java的接口和抽象类