最长上升子序列模板(效率n2和nlogn)

来源:互联网 发布:btsow新域名 编辑:程序博客网 时间:2024/06/16 14:56

效率n*n:

a[]存放需要处理的数,n是a[]长度-1

  • static int LIS(int a[], int n)
  • {
  • int i, j;
  • int ans = 1;
  • int m = 0;
  • int[] dp = new int[n + 1];
  • dp[0] = 1;
  • for (i = 1; i <= n; i++) {
  • m = 0;
  • for (j = 0; j < i; j++) {
  • if (dp[j] > m && a[j] < a[i]) {
  • m = dp[j];
  • }
  • }
  • dp[i] = m + 1;
  • if (dp[i] > ans)
  • ans = dp[i];
  • }
  • return ans;
  • }
  •  
  • 效率nlogn


    import java.util.Scanner;

    public class Main {
        //arr[]存放数
        public static void main(String[] args) {
            int len, index;
            int[] dp = null, arr = null;
            Scanner in= new Scanner(System.in);
            while (in.hasNext()) {
                int T = in.nextInt();
                for (int k = 0; k < T; k++) {

                    len = 0;
                    int n = in.nextInt();
                    dp = new int[n + 1];
                    arr = new int[n+ 1];
                    for (int j = 1; j <= n; j++) {
                        arr[j] = in.nextInt();
                    }
                    dp[++len] = arr[1];
                    for (int j = 2; j <= n; j++) {
                        if (arr[j] > dp[len]) {
                            dp[++len] = arr[j];
                        }
                        index = search(dp, arr[j], 1, len);
                        dp[index] = arr[j];
                    }
                    System.out.println(len);
                }
            }
        }

        private static int search(int[] dp, int value, int start, int end) {
            int mid;
            while (start < end) {
                mid = (start + end) / 2;
                if (dp[mid] > value) {
                    end = mid;
                } else {
                    start = mid + 1;
                }
            }
            return start;
        }
    }