[LeetCode 300] Longest Increasin

2019-05-23  本文已影响0人  灰睛眼蓝

Solution: 用二分法优化时间复杂度到O(nlgn)

建立一个数组ends,把首元素放进去,遍历整个素组:

  1. 如果current num < ends[first],替换首元素为此新元素
  2. 如果current num > ends[last],将此新元素添加到ends数组末尾(注意不覆盖原末尾元素)。
  3. 其他情况,ends[first]<= current num <= ends[last],此时用二分查找法找到第一个不小于此新元素的位置,用当前数覆盖。

以此类推直至遍历完整个nums数组,此时ends数组的长度就是我们要求的LIS的长度

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        
        List<Integer> LIS = new ArrayList<> ();
        LIS.add (nums [0]);
        
        for (int num : nums) {
            if (num < LIS.get (0)) {
                LIS.set (0, num);
            } else if (num > LIS.get (LIS.size () - 1)) {
                LIS.add (num);
            } else {
                int start = 0;
                int end = LIS.size () - 1;
                
                while (start + 1 < end) {
                    int middle = start + (end - start) / 2;
                    
                    if (LIS.get(middle) < num) {
                        start = middle + 1;
                    } else {
                        end = middle;
                    }
                }
                
                int replaceIndex = LIS.get(start) >= num ? start : end;
                
                LIS.set (replaceIndex, num);
            }
        }
        
        return LIS.size ();
    }
}
上一篇下一篇

猜你喜欢

热点阅读