• 最长递增子序列


    package com.hzins;
    
    
    public class MaxLengthArray {
        /**
         * 最长递增子序列 很有意义
         * @param arr 4,-2,3,-4,6,7
         * @return
         */
        public static int[] getdp1(int[] arr){
            int[] dp = new int[arr.length];
            int[] end = new int[arr.length];
            end[0] = arr[0];
            dp[0] = 1;
            int bianjie = 0; //end数组的边界
            for(int i = 1;i<arr.length;i++){
                int index = method(end, arr[i]);
                index = index > bianjie ? ++bianjie : index; //对于越界的处理
                end[index] = arr[i];
                int length = index + 1;
                dp[i] = length;
            }
            
    //        return dp;
            return generateLIS(arr, dp);
        }
        /**
         * 一个递增数列 获取第一个大于等于k的index 比所有的都大的话 会返回数组的长度
         * @param array
         * @param k
         * @return
         */
        public static int method(int[] array, int k){
            int mid = -1;
            int left = 0;
            int right = array.length - 1;
            while(left <= right){
                mid = (left + right) / 2;
                if(array[mid] >= k){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }
            return left;
        }
        public static int[] generateLIS(int[] arr, int[] dp){
            int len = Integer.MIN_VALUE;
            int index = 0;
            for(int i = 0;i<dp.length;i++){
                if(dp[i] > len){
                    len = dp[i];
                    index = i;
                }
            }
            int[] lis = new int[len];
            lis[--len] = arr[index];
            for(int i = index;i>=0;i--){
                if(arr[i] < arr[index] && dp[i] == dp[index] - 1){
                    lis[--len] = arr[i];
                    index = i;
                }
            }
            return lis;
        }
        
        public static void main(String[] args) {
            int[] a = {4,-2,3,-4,6,7};
            int[] dp = getdp1(a);
            for(int i : dp){
                System.out.println(i);
            }
        }
    }
  • 相关阅读:
    关于OCI接口理解
    linux 关闭selinux
    Web 浏览器之事件循环 Event Loop
    Web 浏览器之页面展示原理
    Web 前端工程化(Node、Babel、webpack、Vue、Nginx)
    Web 包管理工具(npm、yarn、cnpm、pnpm)
    kmeans算法
    Django_re_path_使用正则匹配url
    VMware_关机未关闭vm导致显示红叉的处理方法
    Django_发送邮件
  • 原文地址:https://www.cnblogs.com/caobojia/p/6762457.html
Copyright © 2020-2023  润新知