1. 程式人生 > 其它 >Java 併發程式設計學習09 | java執行緒(上)總結

Java 併發程式設計學習09 | java執行緒(上)總結

題目

貪心+二分

很容易將這道題轉化為求最長遞增子序列。這道題n的範圍比較大,O(n^2)的時間複雜度會超時,所以不能使用dp,而應該用貪心+二分。唯一的難點在於xi等於xj該怎麼辦。

public class Main {
    public static void main(String[] args) {
       Scanner scanner=new Scanner(System.in);
        int T=scanner.nextInt();
        for (int k = 0; k < T; k++) {
            int n=scanner.nextInt();
            int[][] nums=new int[n][2];
            for (int j = 0; j < n; j++) {
                nums[j][0]=scanner.nextInt();
            }
            for (int j = 0; j < n; j++) {
                nums[j][1]=scanner.nextInt();
            }
            //當xi=xj時,按y值降序排序,這一步是關鍵
            //因為這樣保證了num>d[len]時兩個x值必然不相等
            Arrays.sort(nums,(a,b)->a[0]==b[0]?b[1]-a[1]:a[0]-b[0]);
            int[] d=new int[n+1];
            int len=1;
            d[len]=nums[0][1];
            for(int i=1;i<n;++i){
                int num=nums[i][1];
                if(num>d[len]){
                    d[++len]=num;
                }else{
                    int l=0,r=len;
                    while(l<=r){
                        int mid=(l+r)/2;
                        if(d[mid]<num) l=mid+1;
                        else r=mid-1;
                    }
                    d[r+1]=num;
                }
            }
            System.out.println(len);
        }
    }
}