每日一题分享(四)

发布于:2023-01-04 ⋅ 阅读:(283) ⋅ 点赞:(0)

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
在这里插入图片描述
分析:
解法一:
1,我们从左到右遍历数组,同时比较相邻两个数据的大小,如果前一个数据大于后一个数据,那么最小值就是后一个数据。
2,如果遍历一遍后没有满足1中的条件,那么开头的数据就是最小值。

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) 
{
    // write code here
   int i=0;
    for(i=0;i<rotateArrayLen-1;i++)
    {
        if(rotateArray[i]>rotateArray[i+1])
            return rotateArray[i+1];
    }
    return rotateArray[0];
}

解法二:
采用二分查找的方式:
1,如果中间值小于最右边的值,那么说明最小值在左边 right=mid。
2,如果中间值大于最右边的值,那么说明最小值在右边 left=mid+1。
3,如果中间值等于最右边的值,那么我们就缩小范围 right–。

 int left=0;
    int right=rotateArrayLen-1;
    int mid=0;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(rotateArray[mid]<rotateArray[right])
        {
            right=mid;
        }
        else if(rotateArray[mid]>rotateArray[right])
        {
            left=mid+1;
        }
        else
        {
            right--;
        }
        
            
        
    }
    return rotateArray[mid];

网站公告

今日签到

点亮在社区的每一天
去签到