ヘルプジョブ:最長連続シーケンス(挿入ヘッド)

タイトル説明 

指定された整数配列がソートされていないために、最も長い連続した配列の長さを求めます。

アルゴリズムの複雑さの時間要件はO(N)です。

例:

入力:[ 100、4、200、1、3、2 ] 
出力: 4の
説明:最長の連続配列である[ 1、2、3、4]。その長さは4です

出典:滞在ボタン(LeetCode)128の
リンク:HTTPS:// leetcode-cn.com/problems/longest-consecutive-sequence 
すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。

 

コード1:

輸入java.util.HashMapを;
インポートjava.util.Scanner; 

パブリック クラスメイン{
     公共 静的 ボイドメイン(文字列[]引数){ 
        スキャナSC = 新しいスキャナ(System.in)。
        文字列str = sc.nextLine()。
        文字列[]ヴァルス = str.substring(1、str.length() - 1).split( "" )。
        長い [] NUM = 新しい ロング[vals.length]。
        以下のためにint型、iはnum.lengthを<; I = 0 iは++ ){ 
            NUM [I] = Long.valueOf(ヴァルス[I] .trim()); 
        } 
        のSystem.out.println(getLongestLegth(NUM))。
    } 
    パブリック 静的 長い getLongestLegth(長い[] NUM){
         長い最大= 0 
        HashMapの <ロング、ロング>マップ= 新しい HashMapの<ロング、ロング> ();
        以下のためにint型私= 0; iはnum.lengthを<; iは++ ){
             場合(!map.containsKey(NUM [I])){
                 長い左= map.get(NUM [i]が-1)== NULL0:map.get(NUM [I] -1 )。//找到当前数的左边连续长度左
                長いですmap.get =右(NUM [I] + +1)== NULL 0 :? map.getとして(NUM [I] + +1 ); //前述の右側の連続した長さの右側見つける
                ロング。電流= 1 + +左、右。//最大連続長
                 IF(電流> MAX){ 
                    最大 = 現在; //最大長更新 
                } 
                map.put([I] NUM、電流); 
                map.put(NUM [I] - 左、現在); //左マージンの更新の最大長 
                map.put(NUM [I] + 右、現在); //右境界の最大長さを更新する 
            } 
        } 
        戻り、maxは
    } 
}

コード2:

 

輸入はjava.util.HashSet。
インポートjava.util.Scanner; 

パブリック クラスメイン{
     公共 静的 ボイドメイン(文字列[]引数){ 
        スキャナSC = 新しいスキャナ(System.in)。
        文字列str = sc.nextLine()。
        文字列[]ヴァルス = str.substring(1、str.length() - 1).split( "" )。
        INT [] NUM = 新しい int型[vals.length]。
        以下のためにint型 i = 0; iはnum.length <; iは++ ){ 
            NUM [I] = Integer.valueOf(ヴァルス[I] .trim())。
        } 
        のSystem.out.println(getIntegerestLegth(NUM))。
    } 
    パブリック 静的 INT getIntegerestLegth(INT [] NUM){
         int型の最大値= 0 もし(num.length <2 ){
             戻りnum.length。
        } 
        HashSetの <整数>設定= 新しい HashSetの<整数> ();
        以下のためにint型 ; iはnum.length <I ++は、I = 0 ){ 
            set.add(NUM [i])とします。
        } 
        のためにint型、iはnum.lengthを<; I = 0 iは++ ){
            もし NUM [I])。(set.remove(NUM [I])){
                 int型 currentLongest = 1 INT =現在NUM [I]。
                一方、(set.remove(現在-1 )){ 
                    電流 - 
                } 
                currentLongest + =(NUM [I] - 現在)。
                電流 = [I] NUM。
                一方、(set.remove(現在+ 1 )){ 
                    電流 ++ 
                } 
                currentLongest + =(電流- =
                最大Math.max(最大、currentLongest)。
            } 
        } 
        リターン最大。
    } 
}

 

コード3

輸入java.util.Arrays。
輸入はjava.util.HashSet。
輸入java.util.PriorityQueue。
インポートjava.util.Scanner; 

パブリック クラスメイン{
     公共 静的 ボイドメイン(文字列[]引数){ 
        スキャナSC = 新しいスキャナ(System.in)。
        文字列str = sc.nextLine()。
        文字列[]ヴァルス = str.substring(1、str.length() - 1).split( "" )。
        INT [] NUM = 新しい int型[vals.length]。
        以下のためにint型 i = 0; iはnum.length <; iは++ ){
            NUM [I] = Integer.valueOf(ヴァルス[I] .trim())。
        } 
        のSystem.out.println(getIntegerestLegth(NUM))。
    } 
    パブリック 静的 INT getIntegerestLegth(INT [] NUM){
         int型の最大値= 0 もし(num.length <2 ){
             戻りnum.length。
        } 
        は、Arrays.sort(NUM)。
        優先度つきキュー <整数> maxQueue = 新しい優先度つきキュー<整数>((A、B) - > B- A)。
        int型 currentLongest = 1 ;
        以下のためのint型I = 0; 私はnum.lengthを<-1; 私は++ ){
             場合(NUM [I + 1] =!NUM [I]){
                 場合(NUM [I + 1] - NUM [I] == 1 ){ 
                    currentLongest ++ 
                } { 
                    currentLongest = 1 
                } 
            } 
            maxQueue.offer(currentLongest)。
        } 
        を返す)(maxQueue.peekします。
    } 
}

 

おすすめ

転載: www.cnblogs.com/haimishasha/p/11354616.html