1. 程式人生 > >Java陣列排序中Comparator介面實現自定義排序

Java陣列排序中Comparator介面實現自定義排序

1、為節點排序。節點由3個欄位組成,包括num ,weight ,height 。先按照weight升序排序,再按照height降序排序。

2、使用Comparator介面規則:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法。升序是前者減去後者,降序是後者減去前者。

3、程式碼測試:同時也是牛客網中某題。

題目描述:

搜狐員工小王最近利用假期在外地旅遊,在某個小鎮碰到一個馬戲團表演,精彩的表演結束後發現團長正和大夥在帳篷前激烈討論,小王打聽了下了解到, 馬戲團正打算出一個新節目“最高羅漢塔”,即馬戲團員疊羅漢表演。考慮到安全因素,要求疊羅漢過程中,站在某個人肩上的人應該既比自己矮又比自己瘦,或相等。 團長想要本次節目中的羅漢塔疊的最高,由於人數眾多,正在頭疼如何安排人員的問題。小王覺得這個問題很簡單,於是統計了參與最高羅漢塔表演的所有團員的身高體重,並且很快找到疊最高羅漢塔的人員序列。 現在你手上也拿到了這樣一份身高體重表,請找出可以疊出的最高羅漢塔的高度,這份表中馬戲團員依次編號為1到N。

輸入描述:

首先一個正整數N,表示人員個數。 
之後N行,每行三個數,分別對應馬戲團員編號,體重和身高。

輸出描述:

正整數m,表示羅漢塔的高度。
示例1

輸入

6
1 65 100
2 75 80
3 80 100
4 60 95
5 82 101
6 81 70

輸出

4

ac程式碼:dp部分參考了其他人思想,因為自己對dp一直不太熟悉,這次ide寫了一遍,手寫了好幾遍去實現整個過程,總算是明白了。心累....

package schooloffer;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 * Created by caoxiaohong on 17/9/22.
 * 搜狐員工小王最近利用假期在外地旅遊,在某個小鎮碰到一個馬戲團表演,精彩的表演結束後發現團長正和大夥在帳篷前激烈討論,....
 * 動態規劃,用到了最長上升子序列問題。首先按照體重從小到大排序,體重相同時,身高高的在上,然後求最長身高上升子序列的長度。
 * 要求:疊羅漢過程中,站在某個人肩上的人應該既比自己矮又比自己瘦,或相等。
 */
public class CircusTroup {
    static class People{
        int num;
        int weight;
        int height;
        public People(int num,int weight,int height){
            this.num=num;
            this.weight=weight;
            this.height=height;
        }
    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int N;
        while (scanner.hasNext()){
            N=scanner.nextInt();
            String inValid=scanner.nextLine();//無效
            People[]  peoples=new People[N];
            for(int i=0;i<N;i++){
                String[] str=scanner.nextLine().split(" ");
                peoples[i]=new People(Integer.valueOf(str[0]),Integer.valueOf(str[1]),Integer.valueOf(str[2]));
            }
            //第一處:注意地方
            //先按照體重升序,再按照身高降序
            //為什麼身高要降序?因為:體重相同時,只有身高也相同才可以站在自己肩上,比自己矮是不能站在自己肩上的。
            //而身高降序就保證了:體重相同時,身高不同為降序,不是升序序列,則不能站在自己肩上.
            Arrays.sort(peoples, new Comparator<People>() {
                @Override
                public int compare(People o1, People o2) {
                    if(o1.weight==o2.weight){
                        return o2.height-o1.height;
                    }else{
                        return o1.weight-o2.weight;
                    }
                }
            });

            //第二處:注意地方 db部分開始
            //按身高求最大升序子序列,不是太會 
            int[] dp=new int[N];
            dp[0]=1;
            int level=0;
            for(int i=1;i<N;i++){
                dp[i]=1;
                for(int j=0;j<i;j++){//通過這裡的程式碼,可以知道:子序列並不需要連續,只要滿足if條件就可以
                    if(peoples[j].height<=peoples[i].height && dp[j]+1>dp[i])
                        dp[i]=dp[j]+1;
                }
            }
            Arrays.sort(dp);
            level=dp[N-1];
            System.out.println(level);
        }
    }
}