【问题标题】:why do we need to create an auxiliary array to rearrange it?为什么我们需要创建一个辅助数组来重新排列它?
【发布时间】:2020-12-27 22:53:57
【问题描述】:

我是 C++ 新手,并解决了在 O(n) 时间内重新排列排序数组的问题,以便首先出现最大元素,然后是最小值,然后是第二个最大值,然后是第二个最小值,所以它去了.

我的解决方案在没有辅助数组结果的情况下无法通过测试,然后我将值复制到该结果中 - 请参阅下面的初始和工作解决方案:

// initial:
void maxMin(int arr[], int size) {
  bool switchPointer = true;
  int min_ptr = 0;
  int max_ptr = size - 1;
  for (int i = 0; i < size; i++) {
    if (switchPointer) {
      arr[i] = arr[max_ptr];
      max_ptr--;
    } else {
      arr[i] = arr[min_ptr];
      min_ptr++;
    }
    switchPointer = !switchPointer;
  }
}

// working
void maxMin(int arr[], int size) {
  int* result = new int[size];
  bool switchPointer = true;
  int min_ptr = 0;
  int max_ptr = size - 1;
  for (int i = 0; i < size; i++) {
    if (switchPointer) {
      result[i] = arr[max_ptr];
      max_ptr--;
    } else {
      result[i] = arr[min_ptr];
      min_ptr++;
    }
    switchPointer = !switchPointer;
  }

    for (int j = 0; j < size; j++) {
        arr[j] = result[j];    // copying to original array
    }
  delete [] result;
}


为什么我们需要一个辅助结果数组?谢谢!

【问题讨论】:

    标签: c++ arrays dynamic-memory-allocation


    【解决方案1】:

    当您需要读取原始数据源而不是修改后的版本时,通常会使用临时变量。在您的情况下,我认为您这样做时会出现问题 arr[i] = arr[max_ptr];arr[i] = arr[min_ptr]; 在您的非工作示例中。在这种情况下,您修改数组并读取 (arr[max_ptr]) 相同的覆盖数组,从而导致算法不一致。使用辅助变量解决了这个问题,因为您读取了原始数据但将其存储在其他地方。

    【讨论】:

      【解决方案2】:

      因为如果您“就地”应用您的算法,您将覆盖原始数组的 MIN 值,然后才能使用它们。想象一下:

      arr = {1, 2, 3, 4, 5}
      

      预期结果是{5, 1, 4, 2, 3}

      • 在第一次迭代中你会做arr[0] = arr[4] // arr[0] is equal to 5 now
      • 在第二次迭代中你会做arr[1] = arr[0] // but this is not what you want, because arr[0] was already changed and is not equal to "1" anymore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 2011-01-15
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多