旋转数组的最小数字

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

具体代码如下:

int minNumberInRotateArray(int* nums, int numsLen ) {
    // write code here
    int left=0;
    int right=numsLen-1;
   
    while(leftnums[right])
        {
            left=mid+1;
        }
        else {
        right=right-1;
        }


    }
 return nums[left];
}

思路:

由于源代码是存在递增顺序,因此旋转后可视为有两段存在递增顺序的代码,因此通过中间元素与最右侧元素可以判断最小元素应该在哪一边。

当中间元素小于最右侧元素时,则中间到右侧一定存在递增,因此最小元素一定在中间偏左。

当中间元素大于最右侧元素时,则中间到右侧一定存在递减,因此最小元素一定在中间偏右。

当中间元素等于最右侧元素时,由于中间元素与最右侧元素相同,无法判断递增或者递减的次序,但是此时删除最右侧元素,原本的整体变化顺序不改变,且中间元素存有和被删除元素相同的数值,即删除最右侧元素无影响,故可以删除最右侧元素。

ps:若原本为递减顺序,则可以和最左侧的元素进行比较,代码如下:

int minNumberInRotateArray(int* nums, int numsLen) {
    // write code here
    int left = 0;
    int right = numsLen - 1;

    while (left < right)
    {
        int mid = (right - left) / 2 + left;
        if (nums[mid] < nums[left])
        {
            left = mid;

        }
        else if (nums[mid] > nums[left])
        {
            right = mid;
        }
        else {
            left = left + 1;
        }


    }
    printf("%d", nums[left]);
    return nums[left];
}

你可能感兴趣的:(算法,数据结构,c语言)