テンキー4は、2つの注文の配列の中央値を見つけるために
ああああああああWAカードは2日間、多くの時間が、私は最終的に全体に出てきました!!!
方法は簡単で、様々な境界条件無敵のピットの父です。
ログ半分を見てみたかったです。中央値は、ターゲットである、または2つの数値を平均化します
どのくらいの各所持の2列にターゲット。その後、もし通常の状況下で、ライン内の2つの最大の比較です。
法的分析して外部の多数最初の他の標的よりもアレイの各々に対する目標範囲内の最後の番号です。
なお:あなたは、境界点に持ち、これらの既存のが妥当であることを示している場合。だから、これを比較しません(あなたが上記を比較しているので、実際に電流が合法であるので、利用可能になるだろう、調整する必要が)(しかし、他の2つの比較条件を比較します)
いくつかの重要なポイント:
理由は非常に多くの書き込みのうち必要な法的/特別な状況の1、そしてそこには、非境界実行し、状態の二分法を継続し続けて書くことを選択します
2、その場合、ジャンプアウトには、いくつかの可能性がありますいない比較が、必要性は準拠していない他を比較することが、
図3は、この状況を修正する、私たちは国境の向こう側に触れないように前方に考慮可能な移動を取る必要があります
図4に示すように、またはそれを直接に決定されていない(B)において、ターゲットの最後の2つに比べて今回
5、範囲内に存在する場合、彼らは別のグループから直接取るように、マークを与えません
6、配列が別の配列、半分の時間で保存この時間全体よりも小さい場合、決意を追加し始めて。
クラス解決{ パブリック: ダブル getNum(ベクトル< INT >&nums1、ベクトル< INT >&nums2、INT ターゲット) { 場合(nums1.size()== 0 ) 戻り nums2 [標的- 1 ]。 もし(nums1 [nums1.size() - 1 <= nums2 [ 0 ]) { 場合(目標<= nums1.size()) 戻り nums1 [標的- 1 ]。 戻り nums2 [ターゲットnums1.size() - 1 ]。 } もし(nums2 [nums2.size() - 1 <= nums1 [ 0 ]) { 場合(目標<= nums2.size()) 戻り nums2 [標的- 1 ]。 戻り nums1 [ターゲットnums2.size() - 1 ]。 } int型の L = 1、R = nums1.size()。 INT、M =(L + R)/ 2。// MB =目標-M + 1;都是第几个[M-1]、B [ターゲット-m]は 、一方(L <= R) { 場合(M <nums1.size()&&ターゲット-M <nums2 .size()&& nums1 [M- 1 ]> nums2 [標的- M]) {R = M- 1、M =(L + R)/ 2。引き続き;} もし(M <nums1.size()&&ターゲット-M <nums2.size()&& nums2 [ターゲット-M- 1 ]> nums1 [M]) {L = M + 1、M =(L + R) / 2。続け;} 破ります。 } INT leftans = M- 1、rightans =目標-M- 1 。 もし(ターゲット-M == nums2.size()&& nums2 [ターゲット-M- 1 ]> nums1 [M]) { 行います { leftans++ ; rightans - ; } 一方(rightans> = 0 && leftans <= nums1.size() - 2 && nums2 [rightans]> nums1 [leftans + 1 ])。 } // coutの<< "HH"。 もし(M == nums1.size()&& nums1 [M- 1 ]> nums2 [標的- M]) { 行う { leftansを - 。 rightans ++ ; } 一方(leftans> = 0&& rightans <= nums2.size() - && nums1 [leftans]> nums2 [rightans + 1 ])。 } // COUT << leftans << rightans << ENDL。 もし(leftans < 0)戻り nums2 [標的- 1 ]。 もし(rightans < 0)戻り nums1 [標的- 1 ]。 リターンMAX(nums1 [leftans]、nums2 [rightans])。 リターン 1 ; } 二重 findMedianSortedArrays(ベクトル< INT >&nums1、ベクトル< INT >& LEN1 = nums1.size()。 LEN2 = nums2.size(); IF(LEN1> LEN2) スワップ(nums1、nums2); INT LEN = LEN1 + LEN2; // 番号が添え字、後ろgetNumしないソートされます。 IF(LEN%2は) 戻り getNum(nums1、nums2、LEN / 2 + 。1 )、 そうでなければ リターン(getNum(nums1、nums2、LEN / 2)+ getNum(nums1、nums2、LEN / 2 + 1))* 1.0 / 2 ; } }。