タイトル説明
指定された整数配列がソートされていないために、最も長い連続した配列の長さを求めます。 アルゴリズムの複雑さの時間要件は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)== NULL?0: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します。 } }