Problem:
Given an unsorted array of integers, find the length of longest increasing subsequence.
Explanation:
找到最长的连续增长的数列长度,数组中的数字可以跳跃使用。
My Thinking:
My Solution:
Optimum Thinking:
- dp[i]表示0-i中的最长序列长度,我们用j对0到i-1进行遍历,如果nums[i]>nums[j],那么i就能延续j的序列,但是由于是最长序列,所以要在j中找到dp[j]最大的一个。
- dp用于保存最长序列,每次使用二分查找来确定数插入dp数组的位置。
Optimum Solution:
(1)
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums.length==0)
return 0;
int[] dp=new int[nums.length];
int maxresult=0;
for(int i=0;i<nums.length;i++){
int maxdp=1;
for(int j=0;j<i;j++){
if(nums[i]>nums[j] && dp[j]+1>maxdp){
maxdp=dp[j]+1;
}
}
dp[i]=maxdp;
maxresult=Math.max(maxresult,dp[i]);
}
System.out.println(Arrays.toString(dp));
return maxresult;
}
}
(2)
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
int len = 0;
for (int num : nums) {
int i = Arrays.binarySearch(dp, 0, len, num);//在dp中从0到len找num
System.out.println(i);
if (i < 0) {
i = -(i + 1);
}
dp[i] = num;
if (i == len) {
len++;
}
}
System.out.println(Arrays.toString(dp));
return len;
}
}