Longest Increasing Subsequence

来源:互联网 发布:通信概预算软件 编辑:程序博客网 时间:2024/06/10 04:32

题目:

给定一个没有排好序的数组,求一个其递增的子序列,返回长度。

使用O(nlogn)的解法。


解题思路:

一般来说,要求使用O(nlogn)时间复杂度的,首先想到二分查找,设置一个非递减的数组。

具体思路看下面的例子。


代码:

 public int lengthOfLIS(int[] nums) {        if (nums == null || nums.length == 0) {            return 0;        }                int[] min = new int[nums.length + 1];        min[0] = Integer.MIN_VALUE;        for (int i = 1; i < min.length; ++i) {            min[i] = Integer.MAX_VALUE;        }                for (int i = 0; i < nums.length; ++i) {            int index = binarySearch(min, nums[i]);            min[index] = nums[i];        }                for (int i = nums.length; i >= 1; --i) {            if (min[i] != Integer.MAX_VALUE) {                return i;            }        }                return 0;    }    //找到大于num的第一个数下标    private int binarySearch(int[] minLast, int num) {        int start =0;        int end = minLast.length - 1;        int mid;        while (start + 1 < end) {            mid = start + ((end - start) >> 1);            if (minLast[mid] < num) {                start = mid;            } else {                end = mid;            }        }        if (minLast[start] > num) {            return start;        }        return end;    }

-----------EOF----------

0 0
原创粉丝点击