LeetCode 2日目

LeetCode0004

  • サイズとnums1 mおよびn nums2二順序付けられた配列を与え。

  • メジアンおよび整然とした配列の両方を検索し、アルゴリズムの時間複雑度はO(ログ(M + N))である必要があります。

  • あなたはnums1とnums2を想定し、両方の空にすることはできません。

アイデア:

  • O(M + N)の時間複雑場合、それは最初に決定nums1及びnums2降順または昇順です。
  • そのデータポインタを末尾にポインタを、下降、ヘッドを介して読み取られ、次いでせるように配列を増加させる、バックから読み出されます。
  • 読ん現在、2つの値を比較し、優先順位は常に一時的な配列の一時の小さなに圧入します。
  • TEMPは、数を決定する対応する中央値を返すように、奇数または偶数です。
//这里我们默认俩数组都是增序,我们先按这个思路提交一下看看是否Accept,测试一下leetcode
var findMedianSortedArrays = function (nums1, nums2) {
    //题目设定nums1和nums2不会同时为空
    if (nums1) {
        if (nums2) {
            let i = 0, j = 0, lens1 = nums1.length, lens2 = nums2.length;
            let tmp = [];
            while (i < lens1 && j < lens2) {
                if (nums1[i] < nums2[j]) {
                    tmp.push(nums1[i]);
                    i++;
                }
                else {
                    tmp.push(nums2[j])
                    j++;
                }
            }
            if (i < lens1) {
                tmp = tmp.concat(nums1.slice(i));
            }
            if (j < lens2) {
                tmp = tmp.concat(nums2.slice(j));
            }
            let totalLen = lens1 + lens2;
            if (totalLen % 2 === 0) {
                return (tmp[totalLen / 2 - 1] + tmp[totalLen / 2]) / 2;
            }
            else {
                return tmp[Number.parseInt(totalLen / 2)];
            }
        }
        else {
            let lens1 = nums1.length;
            if (lens1 % 2 === 0) {
                return (nums1[lens1 / 2 - 1] + nums1[lens1 / 2]) / 2;
            }
            else {
                return nums1[Number.parseInt(lens1 / 2)];
            }
        }
    }
    else {
        let lens2 = nums2.length;
        if (lens2 % 2 === 0) {
            return (nums2[lens2 / 2 - 1] + nums2[lens2 / 2]) / 2;
        }
        else {
            return nums2[Number.parseInt(lens2 / 2)];
        }
    }
};

結果:

によって

  • EMM、しかし、あまりにも、しかし、パーフェクトの追求は、我々は確かに前にそう単純ではないことができます。

思考2(作成者:windliang):

  • 中央値は、最初に求め、実際には、タイトルを求めているkは、我々が最初に探していると仮定すると、小数点以下の特殊なケースをk個の小数、我々は各サイクル除外することができます/ 2 kの数を。以下の例を見てください。
  • 想定nums1 = [1,3,4,9]、nums2 = [1 ... 10]、配列mの合計長さの両方+ N = 14、我々は14/2 = 7少数を探していると仮定する。

  • 我々は、2列の比較のK / 2の場合、桁kが奇数で、切り捨て。すなわち、3つの図の比較、配列アレイ3の上面4と下面で、小さい場合には、アレイの前にそれを表示するかを、K / 2桁最初ないK小さな数字は、除外することができます。それは、我々はそれが除外置くことができ、1,2,3の3つの図は7つの数字より小さくすることはできませんです。二つの配列の比較のために新しい配列として1349及び45678910。

  • より一般的なケースA [1]、A [2 ]、A [3]、A [K / 2] ...、B [1]、B [2]、B [3]、B [K / 2] ...、A [K / 2] <B場合は [K / 2]、 次に[1]、[2 ]、[3]、[K / 2]は最初にすることはできませんK少数。
  • アレイの比率/ 2-1ヶ月A [K / 2]小数値kを有するが、配列Bで、B [K / 2] Aの比は[K / 2]の前にデジタルB [K / 2]を仮定し、小さいです[K / 2]は小さい場合よりも、唯一のK / 2-1ヶ月、アップ/ 1-1 + K / 2-1 = kに[K / 2]少数の比 K-2 2、そう[K / 2]はK-1で最も小さい数です。Aの割合は、[K / 2]の少数にくいKそれらは排除することができるので、少数。
  • デジタル表現のオレンジ色の部分が除去されています。
  • 、その上に3 = 4小さな数字で、k = 4である - 私たちは3つの図を除外しているので、それは三人の大前で特定の番号は、二つの新しい配列ので、我々はわずか7を見つける必要があるということです。この時点で、2つの配列が、二桁目、3 <5、私たちは1を置くことができるとの比較、3小1の配列は除外しました。

  • その上に2 = 2小さなフィギュア - 我々はまた、今4を探して、2桁を除外しました。この時点でそれを行う方法をK / 2 = 1個、4 == 4、の二つの配列を比較しますか?我々は常に予約されたものが削除されるので、影響はありません、配列が何をするかに関係なく取り除くように、2つの数字は、等しいので。統一するために、我々はので、この場合には4削除を下回るとなり、4> 4バーを前提としています。

  • それは番号を削除しているので、今回は4であり、その上に小さな数字どのを決定するために、最初の2つのアレイので、第1の小数値を探しています。
  • 第七の小さな数が4であるので。
  • いくつかのk / 2を比較すると、我々が取るたびに、時にはあなたは、以下のk / 2倍以上の長さの配列が発生する可能性があります。
  • このとき、K / 2が3に等しく、上側及び配列の長さは、この時点で、我々はそれにその矢印の端を指しますが、2です。この場合、2 <3ので、上側2列を除くつながります。下記の結果の状況。

  • 二つの要素が除外されるので、アレイの上部が空であるため、ので、この場合、K = 5、及び、我々はそれ以下アレイの最初の5つの番号を返す必要があります。

  • 我々のアルゴリズムの奇数または偶数の数字は影響されない見つけることであるかどうかを、上から見ることができ、及びアルゴリズムにおいて、kの値が奇数 - 偶数から変更、または最終的に1になったかもしれません配列が空であるため、直接の結果が返されます。
  • 我々は、配列の長さは以下のk / 2よりも防止するために、再帰的なアイデアを使用するので、その番号に対応する各比較分(K / 2、lenの(配列)、除外の配列に対応する少ない数の、二つの新しい配列再帰を入力し、kは負の数の数を減算する。再帰的な出口である場合、K = 1または0、請求配列の長さ。

参考文献:

おすすめ

転載: www.cnblogs.com/zenronphy/p/12151490.html