408 King's Roadデータ構造の授業後のコード演習(5)

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して9日目です。クリックしてイベントの詳細をご覧ください

23 King's Roadのデータ構造で放課後のすべてのコード演習の実装を更新する予定です。試験は通常疑似コードで記述されていますが、強迫性障害のためにすべて実装しました。倉庫はここにあります。

  • 線形テーブル

2.2.3、10

image.png

  • この実際の質問は基本的に質問8と同じです。直接コピーして、パラメーターを変更できます。
  • 1つ目は、激しく解決し、新しい配列を開いて、個別にコピーすることです(構造を配列に変更することも同じです)。
  • この時間計算量はO(n)であり、空間計算量もO(n)です。
  • スペースを節約するために、サイズpの配列を作成して、前の配列[0、p-1]を一時的に格納し、元の配列を全体として左に移動してから、スペースの複雑さを順番に戻すこともできます。 O(p)に縮小されます
void change(SqList &list, int p, int n) {
  // 1.左右两个数组分别是[0, p-1], [p, n-1]
  SqList copied = list;
  int k = -1;
  // 2.分别复制进去
  for (int i = p; i < n; i++) {
    copied.data[++k] = list.data[i];
  }
  for (int i = 0; i < p; i++) {
    copied.data[++k] = list.data[i];
  }
  // 3.新换旧
  list = copied;
}
复制代码
  • 4つまたは2つのダイヤルで1,000ポンド、全体が反転され、次に個別に反転されます
  • たとえば、[1、2、3、4]は[4、3、2、1]に反転され、次に配列[4、3]の1つは[3、4]に反転され、もう1つは[2、 1]が逆になります[1、2]に設定すると、最終結果は[3、4、1、2]になります。
  • 時間計算量O(n)、空間計算量O(1)
void reverse(SqList &list, int l, int r) {
  if (l > r || r > list.length) return;

  for (int i = 0; i < (r-l+1)/2 ; i++) {
    swap(list.data[l+i], list.data[r-i]);
  }
}

void change2(SqList &list, int p, int n) {
  // 注意参数
  reverse(list, 0, n);
  reverse(list, 0, p);
  reverse(list, p, n);
}
复制代码

2.2.3、11

image.png

  • 2つの順序付けられたシーケンスをマージした後に中央値を見つけると、暴力的なソリューションが直接マージされます。
  • 質問7を直接コピーして、その(A.length + B.length)/2位置
  • 次に、すべてをマージする必要はなく、データを格納するための補助テーブルも必要ないことがわかります。この位置にループするだけです。
  • タイトルの要件に注意してください。midは次のようになります。(A.length + B.length - 1) / 2
  • 時間計算量O(n)、空間計算量O(1)
int merge(SqList A, SqList B) {
  int i = 0, j = 0, k = -1, mid = (A.length + B.length - 1) / 2;
  
  // 条件也不需要,因为我们找到中间值就会直接return
  while (1) {
    ++k;
    if (A.data[i] <= B.data[j]) {
      if (k == mid) return A.data[i];
      i++;
    } else {
      if (k == mid) return B.data[j];
      j++;
    }
  }
}
复制代码
  • 真ん中に直接ループすることもできます。毎回判断する必要はありません。==mid
int merge2(SqList A, SqList B) {
  int i = 0, j = 0, mid = (A.length + B.length - 1) / 2 ;
  while (i+j < mid) {
    if (A.data[i] <= B.data[j]) i++;
    else j++;
  }
  return A.data[i] < B.data[j] ? A.data[i] : B.data[j];
}
复制代码
  • 最適な解決策は試験に推奨されません、時間コストが高すぎます(大物を除く)、結局のところ、暴力的な解決策はせいぜい5ポイントのギャップしかないようです、それは不要です
  • ここには書きません、ワンダオの答えを見てください

おすすめ

転載: juejin.im/post/7085255116026019847