I.はじめに
今日は、第四質問を始めた2つの命じた配列の中央値を探してください。この問題のleetcodeの難しさをマーキングすることは困難であり、これは私おびえ見えるかもしれ、困難な主題の前に実行されませんでした。私は行く、私は一瞬のために非常に簡単タイトルが、また少し幸せを感じる。しかし、私は彼らのレベルが高くなると考えました。読み取り排水条件、あまりにも早く彼女の顔結果、複雑さのOのために必要な時間は(+ N(ログインメートル))、本当に難しいです。いくつかの単語の男は言いました。タイトルを見てください。
II。トピック
タイトル:サイズとnums1 mとnはnums2の2つの命じたアレイを考えます。
メジアンおよび整然とした配列の両方を検索し、アルゴリズムの時間複雑さを必要としてくださいはO(ログ(M + N))です。
あなたはnums1とnums2両方が空を負いかねます。
実施例1:nums1 = [1、3]
nums2 = [2]
中央値は2.0です
実施例2:nums1 = [1、2]
nums2 = [3、4]
中央値は、(2 + 3)/ 2 = 2.5であります
III。問題解決のアイデア
タイトルは偶数の場合、中央の2つは2で割る、それはそれの真ん中で、それが奇数の場合、2つの数字の後に中央値を見つけることです、理解しやすいことを意味します。
1)流出方法:新しいアレイの手段と、2つのアレイへの2つのポインタを使用して、ポインタの要素を比較し、新しい小さなアレイに配置され、次いでポインタ、O(M + N)の時間複雑度、コードを移動次のように:
1 クラスソリューション{ 2 公共 ダブル findMedianSortedArrays(INT [] nums1、int型{[] nums2) 。3 // 新しい配列、2つの配列の長さの長さを作成します 。4 INT [] NUM = 新しい新しい INT [nums1.length + nums2を.LENGTH]; 5は、 // ポインタ一つは、配列へのポインタ 。6 int型のインデックス1は、= 0 ; 7 // ポインタ2個、2点アレイ 。8 int型 INDEX2 = 0 ; 9 用(INT I = 0;私はnum.lengthを<; I + + ){ 10 //二つのポインタは、ポインタ移動させる必要性に比べて、アレイの端でない場合 11 // 直接残留、一端が新しいアレイ部分に別の配列 12である IF(index1の、<&& nums1.length INDEX2を< nums2.length){ 13は NUM [I] = nums1 [index1の、<= nums2 [INDEX2] nums1 [index1の、++]:[?++ INDEX2 nums2 ]; 14 } そう IF(index1の、< nums1.length){ 15 NUM [I] nums1 = [index1の、++ ]; 16 } 他{ 17 NUM [I] = nums2 [++ INDEX2 ]; 18である } 19 } 20 //奇数及び偶数配列に応じて、中央値を計算する 21ことである IF(num.length%2 == 0 ){ 22で リターン(ダブル)(NUM + NUM [num.length / 2] [num.length / 21です]) /(ダブル)2 ; 23れる } 他{ 24 リターン NUM [(num.length - 1)/ 2 ]; 25 } 26である } 27 }
2)上記の試験に合格したものの、私はそれを行うために始めたということですが、((m + nはログ))Oの時間複雑に達しなかったが、第二の方法はまだ出て来てほしい、とそう後で補足していません上の、あなたのアイデアを持っているし、私も交流を共有することができれば、あなたに感謝!