题目
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
思路
利用一个简单的动态规划来解答就可以了。开一个dp数组,dp[i]表示以当前数字结尾的最长递增子序列,然后每次都是初始值为1,因为最少就有本身的一个数字。然后从前面往后遍历,一旦出现nums[j]<nums[i],表示当前dp[i]的状态可以由dp[j]+1转换而来。假设要求不严格递增,条件就可以为nums[j]<=nums[i]。需要注意一点是,并不是最后的dp[i]就是一个最大值,我们的dp[i]表示的意思是最后的数字一定要取到,当最后的数字很小时,dp[i]不一定能取得结果的最大值,所以我们需要每次都进行一次比较。
代码
//最长递增自序列,dp[i]为考虑前i个元素,并且nums[i]必须选取的最大子序列
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length==0)
return 0;
int length=nums.length;
int dp[]=new int[length];
int ans=1;
dp[0]=1;
for (int i=1;i<length;++i)
{
dp[i]=1;//至少有一个,即本身
for (int j=0;j<i;++j)
{
if (nums[i]>nums[j]) //可以由比它小的数这个状态转移过来,只要该数比它小就可以加1进行比较
dp[i]=Math.max(dp[i],dp[j]+1);
}
ans=Math.max(ans,dp[i]); //每次都要取出dp[i]中最大的那一个作为结果
}
return ans;
}
}
结果
AC了,
也算是学到了动态规划的另外一个子问题,还算有点收获,不错不错!