https://leetcode-cn.com/problems/next-greater-element-i/
与えられた2つの配列がnums1がnums2のサブセットであり、重複する要素とnums2をnums1ありません。nums2の各要素の下にNums1値よりも大きくなっています。
次に高い要素番号は、最初の要素をnums1 X X X対応する参照nums2に正しい位置よりも大きくなっています。ない場合は、位置出力は-1に対応します。
例1:
入力:nums1 = [4,1,2]、nums2 = [1,3,4,2]。
出力:[1,3、-1]
説明:
図4でNUM1のために、あなたは秒ではありませんアレイは、次のより多く、従って、出力1を検索します。
図1にNUM1ため、右側の二番目の配列番号1の次のより高い数は3です。
数2においてNUM1ため、二番目の配列には、次のより多く、従って出力1はありません。
例2:
入力:nums1 = [2,4]、nums2 = [1,2,3,4]
出力:[3、-1]
説明:
NUM1の番号2、次に高い番号の二番目の配列で3。
図面4にNUM1ため、二番目の配列には、次のより多く、従って出力1はありません。
注意:
nums1とnums2すべての要素がユニークです。
nums1とnums2配列のサイズは、1,000人以上ではありません。
鶏肉料理をお試しください
エレガントな方法で問題をうまくするためにどのくらいの時間を考えて、タイトルを得るが、原因限られた容量まで、またはOを取るために(N 2弟の行動)
1 クラスソリューション{ 2 公共: 3 ベクトル< INT > nextGreaterElement(ベクトル< INT >&nums1、ベクトル< INT >&nums2){ 4 ベクトル< INT > 結果。 5 のintフラグ= 0 。 6 INT FLAG2 = 0 。 7 のために(int型 iは= 0 ; iはnums1.sizeを()<; iは++ ){ 8 フラグ= 0 。 9 FLAG2 = 0; 10 INT CURR = nums1 [I]。 11 のための(int型 J = 0 ; J <nums2.size(); J ++ ){ 12 であれば(nums2 [J] == CURR){ 13 FLAG2 = 1 。 14 } 15 であれば(nums2 [J]> CURR && FLAG2 == 1 ){ 16 result.push_back(nums2 [J])。 17 フラグ= 1 。 18 ブレーク; 19 } 20 } 21 であれば(フラグ== 0 ){ 22 result.push_back( - 1 )。 23 } 24 } 25 リターン結果。 26 } 27 }。
このように、暴力が説明されていないが、データがかなり素敵emmmを持っていたどのように素晴らしいです、このアルゴリズムはそれほど差は思えません。
鶏肉料理ギャングソリューションを探します。
読み取り専用に長い、長い、長い時間を読んで!その後感じ:確かに兄を!
1 クラスソリューション{ 2 公共: 3 ベクトル< INT > nextGreaterElement(ベクトル< INT >&nums1、ベクトル< INT >&nums2){ 4 地図< INT、INT > 融点; 5 スタック< 整数 > スタック。 6 7 用(INTの値:nums1){ 8 MP [値] = - 1 。 9 } 10 11 のために(int型 I =0 ; i)は(nums2.sizeを<; iは++ ){ 12 ながら && stack.top()<(stack.empty(!)nums2 [I]){ 13 、MP [stack.top()] = nums2 [I]。 14 stack.pop()。 15 } 16 stack.push(nums2 [I])。 17 } 18 19 のために(int型 iは= 0 ;)私は(nums1.sizeを<; iは++ ){ 20 nums1 [I] = 融点[nums1 [I]]。 21 } 22 リターンnums1。 23 } 24 }
最初のアイコンを置きます
マップを作成し、インデックスAは、ベクトル要素の値は、要求の最大値です。マップ値は-1に初期化されます。
我々の意図は、(N Oを避けるためですので2)、優れたO(N)のために努力するので、我々は最高の唯一のベクトルB.一度横断のために願っています しかし、明らかに結果を更新するだけで達成度横断することはできません前に、それが横断ので、我々はサイドアップデートを横断しながら、考えます。スタックの設計、スタックが現在の要素と親ベクターの先頭の要素(すなわち、親ベクトルは、現在の要素の次の最大値は、親ベクトルの先頭要素である)未満の空でない場合、保存された一方と地図ポップアップ各ポップ要素のスタックスペース、彼らは現在の要素の最大値を取得するには親ベクターの下にあります。スタックに親ベクターの最終要素。相互的には、親ベクターを横断したまで。
最後に、結果に対応するマップで抽出されたサブベクトルを横断するだけ必要。
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/next-greater-element-i
すべてのネットワークからの控除が著作権を保有。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。