Leetcode 300. Longest Increasing Subsequence
题目
解法1:brutal force recursion(TLE)
这道题是著名的LIS。按照leetcode的惯例,subsequence是可以不连续的,但是subarray或者说substring是必须连续的。这个在后面讲到相关的题目的时候也会讲到
这边最直观的方法,也就是所谓的brutal force当然是找出所有可能的increasing sequence,然后取最大的。由于这道题是个很经典的动态规划题,就不详细介绍这第一种解法了,直接上代码。
python代码如下:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
def dfs(curr_pos,prev):
if curr_pos == len(nums):
return 0
taken = 0
if (nums[curr_pos]>prev):
taken = 1 + dfs(curr_pos+1,nums[curr_pos])
not_taken = dfs(curr_pos+1,prev)
return max(taken,not_taken)
return dfs(0,float('-inf'))
这样解是超时的,因为有很多重复的recursion操作,当然可以用recursion+memorization的方法来做,不过这边就不介绍了。
解法2:动态规划 (O(n*n)解法)
这边第一种dp是最常见的解法,也是最容易理解的,具体如下:
- 定义一个dp数组,dp[i]代表到i这个位置结束能形成的increasing sequence的最大长度
- 状态转移方程为
dp[i] = max(dp[i],dp[j]+1) if nums