您的位置:首页 > 其它

算法_动态规划_最长单调递增子序列问题(O(nlogn)的时间复杂度)

2016-04-07 23:23 543 查看
import java.util.Scanner;

public class Main {
static int n;
static int[] arr;
static int[] dp;

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
arr=new int
;
dp=new int[n+1];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int flag=1;
dp[1]=arr[0];
for(int i=1;i<n;i++){
if(arr[i]>dp[flag]){
dp[++flag]=arr[i];
}else{
int index=binarySearch(i,flag);
dp[index]=arr[i];
}
}

System.out.println(flag);
}

static int binarySearch(int i,int flag){
int high=flag;
int low=1;
while(true){
if(high<low){
return low;
}
if(high==low){
return high;
}
int mid=(high+low)/2;
if(arr[i]==dp[mid]){
return mid;
}else if(arr[i]<dp[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: