题解 | JAVA #二分查找 #最长上升子序列(一)# [P0-T2]

最长上升子序列(一)

http://www.nowcoder.com/practice/5164f38b67f846fb8699e9352695cd2f

经典的LIS问题的最简形态(求LIS长度)
核心逻辑是:
  mem[n]: 长度为n+1的LIS的最后一个数的最优值(i.e. 最小).
  
有O(n^2)和O(nlogn)时间两种解。
import java.util.*;

// time O(nlogn) solution
// 视频讲解 https://www.youtube.com/watch?v=l2rCz7skAlk
public class Solution {
    public int LIS (int[] arr) {
      if (arr.length <=1 ) return arr.length;

      // mem[i]: 长度为i+1的LIS的最后一个数的最优值(i.e. 最小).
      // LIS.length<=arr.length, 所以就用arr.length去初始
      int[] mem = new int[arr.length];
      // 初始: LIS = { arr[0] }
      mem[0] = arr[0];
      int lenLIS = 1;
      
      for (int i = 1; i < arr.length; i++) {
        int num = arr[i];
        // search for num in mem[0, lenLIS-1]
        // note: mem[0, lenLIS-1] is already sorted
        // 请务必参照Arrays.binarySearch的documentation
        // 我只能说用Java刷题的咱们都是上辈子折翼的天使
        int result = Arrays.binarySearch(mem, 0, lenLIS, num);
        
        // result>=0表示found,那么插不插入都一样
        if (result >= 0) continue;
        
        // else,result = -insertionPoint - 1
        int insertionPoint = -1-result;
        mem[insertionPoint] = num;  // replace
        // num大于mem[0, lenLIS-1]里的所有数, 
        // i.e. 之前的replace其实是个append, 所以lenLIS++
        if (insertionPoint == lenLIS) lenLIS++;
      }
      
      return lenLIS;
    }
}
import java.util.*;

// time O(n^2) solution
public class Solution {
    // dp[i]: length of LIS ending at i.
    //  = MAX{ dp[j] + 1 }, for j < i && arr[j] < arr[i]
    public int LIS (int[] arr) {
      int[] dp = new int[arr.length];
      Arrays.fill(dp, 1); // dp[i] is at least 1, i.e. 1 element
      int maxLen = 0;
      
      for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < i; j++) {
          if (arr[j] < arr[i]) {
            dp[i] = Math.max(dp[i], dp[j]+1); 
          }
        }
        maxLen = Math.max(maxLen, dp[i]);
      }
      
      return maxLen;
    }
}
DP是真的烦 文章被收录于专栏

只是为了把DP的题集中一下方便自己复习

全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
昨天 21:43
已编辑
Imperial College London Java
汇丰科技 oc 18*12 + 年终
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务