最长递增子序列的长度

最长递增子序列的长度

问题

这个题目说的是,给你一个整数数组,你要计算数组里最长递增子序列的长度。其中,子序列不要求连续

比如说,给你的数组 a 是:

1, 8, 2, 6, 4, 5

在这个数组里,最长的递增子序列是:

1, 2, 4, 5

因此你要返回它的长度 4。
public class AlgoCasts {

  // Time: O(n^2), Space: O(n)
  public int lengthOfLISDP(int[] nums) {
    if (nums == null || nums.length == 0) return 0;
    int n = nums.length, max = 1;
    int[] d = new int[n];
    d[0] = 1;

    for (int i = 1; i < n; ++i) {
      for (int j = 0; j < i; ++j) {
        int cur = nums[i] > nums[j] ? d[j] + 1 : 1;
        d[i] = Math.max(d[i], cur);
      }
      max = Math.max(max, d[i]);
    }
    return max;
  }

  private int binarySearchInsertPosition(int[] d, int len, int x) {
    int low = 0, high = len - 1;
    while (low <= high) {
      int mid = low + (high - low) / 2;
      if (x < d[mid]) high = mid - 1;
      else if (x > d[mid]) low = mid + 1;
      else return mid;
    }
    return low;
  }

  // Time: O(n*log(n)), Space: O(n)
  public int lengthOfLISBinarySearch(int[] nums) {
    if (nums == null || nums.length == 0) return 0;
    int n = nums.length, len = 0;
    int[] d = new int[n];
    for (int x: nums) {
      int i = binarySearchInsertPosition(d, len, x);
      d[i] = x;
      if (i == len) ++len;
    }
    return len;
  }

}

 上一篇
旋转有序数组的最小值 旋转有序数组的最小值
旋转有序数组的最小值问题 这个题目说的是,给你一个不为空的旋转有序数组,数组中不包含重复数字,你要找到这个数组中的最小值并返回它。旋转有序数组是由一个原来有序的数组通过左旋或右旋部分数字到另一端形成的。注意,这里我们讨论的有序默认都指递增排
2019-03-16
下一篇 
如何定位消耗CPU最多的线程 如何定位消耗CPU最多的线程
如何定位消耗CPU最多的线程之前有朋友反馈说发的内容希望有个梯度,逐步加深,前面发了几篇关于jvm源码分析的文章,可能我觉得我已经把内容写得浅显易懂了,但是对于某些没怎么接触的同学来说还是比较难理解,这个我以后慢慢改进吧,今天发篇轻松点的文
2019-03-15
  目录