【问题标题】:Finding the pivot point in a rotated sorted array在旋转的排序数组中查找枢轴点
【发布时间】:2012-09-08 05:55:39
【问题描述】:

首先让我说我是 C 新手,所以我的方法是基本的。我正在尝试检查排序数组的旋转点。例如 (1 2 4 5 9) 变为 (5 9 1 2 4)。我试图将数组“拆分”为两个子数组,并检查一个从 [0] 开始并增加一和一个从 [4] 开始并减少一。这是我目前所拥有的:

#define size 5
int main(void)
{
int x, i, j, start, end;
int array1[size]= {4, 8, 0, 1, 3};
start = 0;
end = size -1;
while(start < end)
{
if (array1[start] < array1[end])
    start++;
    end--;

我想我遇到的一些问题是我的方法是好的(从外到内)还是应该从中间开始,然后走出去。另外,我将如何编码确定枢轴实际发生的位置。我在 SO 中看到了 C++ 的一些答案,但是我没有看到很多对 C 来说很清楚的答案,所以我想我会问。任何建议表示赞赏。

【问题讨论】:

  • 因为array1[0] == 4array1[end] == 3if (4 &lt; 3) 不会占用分支,所以该循环将无限期地继续。
  • 我可以建议您在编译器中尝试一下吗?不是看它是否是最好的解决方案,或者它是否适用于所有情况,而是看是否有一些明显的错误,编译器会帮助你捕捉到。
  • @bardockyo startend 永远不会改变,因此循环将无限期地继续。

标签: c arrays search pivot sorted


【解决方案1】:

这个问题很容易解决。由于原始集合已排序,因此只需向前迭代,直到您命中的元素小于数组中的最终元素——这是原始的第一个元素,因此您知道它与起点的距离与 R ( mod N) 其中 R 是旋转距离,Nsize

int last = array[size - 1];
int r;
for (r = 0; array[r] >= last; ++r) ;
int pivot = array[r];
/* pivot was the original array[0] */

【讨论】:

  • 这是 O(n),但有一种方法可以在 O(log(n)) 中做到这一点
  • O(log(n)) ,可以使用二分查找的概念来实现。
【解决方案2】:

在 C 中查找枢轴元素的代码

int findPivot(int arr[], int low, int high)
{
   // base cases
   if (high < low)  return -1;
   if (high == low) return low;

   int mid = (low + high)/2;   /*low + (high - low)/2;*/
   if (mid < high && arr[mid] > arr[mid + 1])
     return mid;
   if (mid > low && arr[mid] < arr[mid - 1])
     return (mid-1);
   if (arr[low] >= arr[mid])
     return findPivot(arr, low, mid-1);
   else
     return findPivot(arr, mid + 1, high);
}

当数组已经排序时返回 -1,其余的事情像二分搜索一样照常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多