300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))

【LeetCode】300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))

  算法新手,刷力扣遇到这题,搞了半天终于搞懂了,来这记录一下,欢迎大家交流指点。

 

题目描述:

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

 

解法一:暴力递归

  不解释,先暴力搞一下。(时间复杂度O(n^3),不行)

 1 class Solution {
 2 public:
 3     int l(vector<int>& nums) { // 返回以nums[0]开头的最长递增序列长度
 4         if (nums.size() < 2)
 5             return nums.size();
 6         int max_len = 1;
 7         for (int i = 1; i < nums.size(); ++ i)
 8             if (nums[i] > nums[0]) {
 9                 vector<int> t{nums.begin() + i, nums.end()};
10                 max_len = max(max_len, l(t) + 1);
11             }
12         return max_len;
13     }
14     int lengthOfLIS(vector<int>& nums) { // 所有序列遍历一遍
15         int max_len = 1;
16         for (i = 0; i < nums.size(); ++ i) {
17             vector<int> t(nums.begin() + i, nums.end());
18             max_len = max(max_len, l(t));
19         }
20         return max_len;
21     }
22 };
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))