首页 > 其他分享 >力扣:153. 寻找旋转排序数组中的最小值

力扣:153. 寻找旋转排序数组中的最小值

时间:2023-04-13 20:33:37浏览次数:46  
标签:153 nums int mid 旋转 力扣 最小值 数组 left

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

 

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
 

提示:

n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 中的所有整数 互不相同
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码如下

//[1 2 3 4 5]旋转第5次
//[2 3 4 5 1]旋转第1次
//[3 4 5 1 2]旋转第2次
//[4 5 1 2 3]旋转第3次
//[5 1 2 3 4]旋转第4次
//观察可以发现当中间任意元素mid,如果比left大则最小的元素min一定在右边且不是mid本身,而如果比left小则一定在右边但有可能是mid本身。
//而当left比right小时可以肯定left就是最小的元素min
int findMin(int* nums, int numsSize) {
    int left = 0;
    int right = numsSize - 1;
    int mid;
    while (left <= right)
    {
        if (nums[left] <= nums[right])
        {
            return nums[left];//返回最小值
        }
        mid = (left + right) / 2;
        if (nums[mid] > nums[left])
        {
            left = mid + 1;//最小值在右侧
        }
        else if (nums[mid] < nums[left]) {//最小值在左侧
            right = mid;
        }
        else//mid和left相等时为避免死循环自增+1吗,并在下一次循环中返回
        {
            left++;
        }
    }
    return 0;//这段代码无任何意义,不知道为什么不加这段代码提交编译出错
}

void test01()
{
    
    /*int arr[5] = { 1,2,3,4,5 };*/
    //int arr[5] = { 2,3,4,5,1 };
    int arr[7] = { 4,5,6,7,0,1,2};
 /*   int arr[5] = { 4,5,1,2,3 };*/
    /*int arr[5] = { 5,1,2,3,4 };*/
    int a=findMin(arr, 7);
    cout << a;
}

int main()
{
    test01();
    return 0;
}

 

标签:153,nums,int,mid,旋转,力扣,最小值,数组,left
From: https://www.cnblogs.com/wlxdaydayup/p/17316290.html

相关文章

  • 力扣1127(MySQL)-用户购买平台(困难)
    题目:支出表:Spending这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端(‘desktop’)和手机端(‘mobile’)的应用程序。这张表的主键是(user_id,spend_date,platform)。平台列platform是一种ENUM,类型为(‘desktop’,‘mobile’)。问题写一段SQL......
  • 力扣1126(MySQL)-查询活跃业务(中等)
    题目:事件表:Events此表的主键是(business_id,event_type)。表中的每一行记录了某种类型的事件在某些业务中多次发生的信息。问题写一段SQL来查询所有活跃的业务。如果一个业务的某个事件类型的发生次数大于此事件类型在所有业务中的平均发生次数,并且该业务至少有两个这样......
  • 力扣1132(MySQL)-报告的记录Ⅱ(中等)
    题目:编写一段SQL来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后2位。Actions表: Removals表:Result表:2019-07-04的垃圾广告移除率是50%,因为有两张帖子被报告为垃圾广告,但只有一个得到移除。2019-07-02的垃圾广告移除率是100%,因......
  • 力扣---剑指 Offer 39. 数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[1,2,3,2,2,2,5,4,2]输出:2 限制:1<=数组长度<=50000注意:本题与主站169题相同:https://leetcode-cn.com/problems/majority-el......
  • 力扣74. 搜索二维矩阵
    编写一个高效的算法来判断 mxn 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。 示例1:   输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,60]],target=3输出:true示例2: 输......
  • 力扣 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 力扣1113(MySQL)-报告的记录(简单)
    题目:动作表:Actions 此表没有主键,所以可能会有重复的行。action字段是ENUM类型的,包含:('view','like','reaction','comment','report','share')extra字段是可选的信息(可能为null),其中的信息例如有:1.报告理由(areasonforreport)2.反应类型(atypeo......
  • 力扣-数组-螺旋矩阵
     题目顺序59螺旋矩阵Ⅱ,解题思路1.按照num从小到大依次填充,遵循从左到右,从上到下,从右到左,从下到上的层循环顺序;2.层循环中要注意,每个部分保持相同的开闭原则,左闭右开或左开右闭防止混淆出错;3.每层循环的start是不同的;每层循环的每部分个数依次减少;4.注意n的奇偶,奇数单独对中......
  • 力扣1112(MySQL)-每位学生的最高成绩(中等)
    题目:表:Enrollments(student_id,course_id)是该表的主键。问题编写一个SQL查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取course_id最小的一门。查询结果需按student_id增序进行排序。示例Enrollments表:Result表: 建表语句:1CreatetableIf......
  • C语言矩阵顺时针旋转90度和力扣34. 在排序数组中查找元素的第一个和最后一个位置
    #include<iostream>usingnamespacestd;#defineM5#include<stdlib.h>//原矩阵,某元素第n行第m列,;顺时针旋转90度后,位置变成倒数第n列,第m行//即先转置再水平翻转intn=0;voidrotation_90(intmatrix[][M],intn){ for(inti=0;i<n;i++) { for(intj=i;j<M;j++)......