前言
本篇文章来自leedcode,是博主的学习算法的笔记心得。
如果觉得对你有帮助,可以点点关注,点点赞,谢谢你!
题目来源
暴力法
超时了O(n^2),我最开始的想法
对于每个位置都数都有选与不选的分支,但是选这个数要保证这个数比上一个被选的数大
int maxLen=Integer.MIN_VALUE;
public int lengthOfLIS(int[] nums) {
dfs(nums, 0, 0, Integer.MIN_VALUE);
return maxLen;
}
//sun记录的是上一个被选的数
void dfs(int[] nums, int index, int len, int sum){
if(index==nums.length){
maxLen=Math.max(maxLen, len);
return;
}
if(nums[index]>sum){
dfs(nums, index+1, len+1, nums[index]);
}
dfs(nums, index+1, len, sum);
}
动态规划
dp[i]代表以nums[i]结尾的最大长度:初始化为1,比较前面的有没有dp[j]>dp[i](j<i),得到最大值dp[i]
再从dp[i]中得到最大值
public int lengthOfLIS(int[] nums) {
if(nums.length==0)return 0;
int[] dp=new int[nums.length];
int maxLen=1;
dp[0]=1;
for (int i = 1; i < nums.length; i++) {
dp[i]=1;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=Math.max(dp[i], dp[j]+1);
}
}
maxLen=Math.max(maxLen, dp[i]);
}
return maxLen;
}