题解 | #旋转数组的最小数字#

旋转数组的最小数字

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
/*方法1:*/
int minNumberInRotateArray(int* nums, int numsLen ) {
    // write code here
    //直接冒泡排序,取最小;
    for(int i=1;i<numsLen;i++)//最大需要移动numslen-1
    {
        for(int j=0;j<numsLen-i;j++)
        {
            if(nums[j]>nums[j+1])
            {
                int tmp=nums[j];
                nums[j]=nums[j+1];
                nums[j+1]=tmp;
            }
        }
    }
    return nums[0];
}

/*方法2:*/
int minNumberInRotateArray(int* nums, int numsLen ) {
    //write code here
    /*因为是旋转数组,峰值一定是分界线,mid=(numslen-1)/2,mid+1
    至于如何找到分界线:
    因为从中间值分开,左边的有序序列的所有值都是大于右边的,
    以右边端点为例:
        ==  不可能出现,因为最极端也是右边序列最大=左边序列最小
        mid值>右边  落在左边有序区域----峰值在右恻====mid右移.
        mid值<右边  落在右边有序区域----峰值在左恻====mid左移
    概括来说就是:遇到比右边端点大的右移,遇见比右边小的左移
    */


    int start=0, end=numsLen-1, mid;
  
    while(end-start>=1) {
        mid = (end+start+1)/2;

        if( (nums[mid] < nums[end]))
            end = mid;
        else if( (nums[mid] > nums[end]))
            start = mid;
        else {
            if(nums[start]>=nums[end])
                start++;
            else
                end--;
        } 
    }
    return nums[start];
}

全部评论

相关推荐

02-25 13:02
中南大学 C++
点赞 评论 收藏
分享
02-28 13:25
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务