zoukankan      html  css  js  c++  java
  • 【leetcode】300.Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence.

    For example,
    Given [10, 9, 2, 5, 3, 7, 101, 18],
    The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there may be more than one LIS combination, it is only necessary for you to return the length.

    Your algorithm should run in O(n2) complexity.

    Follow up: Could you improve it to O(n log n) time complexity?

    Tip:给定一个无序数组,求出数组中最长的递增子序列的长度。(我原来错误的以为求连续的最长递增子序列长度,但本文并没有要求子序列连续。)

    实例化一个与给定数组nums相同长度的数组min来存储递增子序列,并另min[0]=nums[0]。

    遍历nums数组,如果后一个元素大于当前元素,min[len++]=nums[i].

    否则就从min数组中找到最后一个小于当前元素的位置,并插入到min数组中,(最后一个小于当前元素的后面)。

    findPosition函数用来找到插入位置,时间复杂度为O(logn)。

    lengthofLIS()遍历整个数组时间复杂度为O(n)

    所以整体复杂度为O(nlogn)

    package medium;
    
    public class L300LongestIncreasingSubsequence {
        public int lengthOfLIS(int[] nums) {
            if (nums == null || nums.length <= 0)
                return 0;
            int len = 0;
            int[] min = new int[nums.length];
            min[len++] = nums[0];
            for (int i = 1; i < nums.length; i++) {
                if (nums[i] > min[len - 1]) {
                    min[len++] = nums[i];
                } else {
                    int position = findPosition(min, 0, len - 1, nums[i]);
                    System.out.println(position);
                    min[position] = nums[i];
                }
            }
            return len;
        }
    
        private int findPosition(int[] min, int low, int high, int k) {
            // 在min【】中找到k可以换的位置
            while (low <= high) {
                int mid = low + (high - low) / 2;
                if (min[mid] == k) {
                    return mid;
                } else if (min[mid] > k) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return low;
        }
    
        public static void main(String[] args) {
            L300LongestIncreasingSubsequence l300 = new L300LongestIncreasingSubsequence();
            int[] nums = { 10, 9, 2, 5, 3, 7, 101, 18 };
            int[] nums1 = { 1, 3, 2 };
            int len = l300.lengthOfLIS(nums1);
            System.out.println(len);
        }
    }
  • 相关阅读:
    Eclipse报告内存不足和PermSize space错误,Eclipse死掉的解决办法
    jquery插件:文字滚动和google地图位置选择搜索
    CGI、ISAPI和FastCGI三种配置方式
    240多个jQuery插件
    调用外部命令不弹出窗口示例
    将DataSet变化保存到数据源
    Fill()方法和Conn.Open()
    SqlDataAdapter的DeleteCommand属性
    SqlDataAdapter的InsertCommand属性
    使用数据集和XML
  • 原文地址:https://www.cnblogs.com/yumiaomiao/p/8398052.html
Copyright © 2011-2022 走看看