首页 > 其他分享 >153. 寻找旋转排序数组中的最小值(中等)

153. 寻找旋转排序数组中的最小值(中等)

时间:2024-07-03 13:29:44浏览次数:15  
标签:153 right nums mid 最小值 tail 排序 left

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

1. 题目描述

题目中转:153. 寻找旋转排序数组中的最小值
在这里插入图片描述
在这里插入图片描述

2.详细题解

    如果不考虑 O ( l o g n ) O(log n) O(logn)的时间复杂度,直接 O ( n ) O(n) O(n)时间复杂度的扫描遍历一次即可。
    严格升序数组,即不存在相同元素的两个值。如果不旋转则最小的数值即为第一个(索引为0)的数值,数组旋转了1到n次,寻找数组中最小的元素,这道题是二分查找的变型题。
  假定最小值为 m i n x min_x minx​,数组旋转后,假定结尾最后一个值为 t a i l tail tail,对于最小值 m i n x min_x minx​,其右边的元素均小于 t a i l tail tail,而其左边的元素均大于 t a i l tail tail的值,可以利用该性质使用二分查找算法。
  具体算法如下:

  • Step1:初始化:两个指针 l e f t left left 和 r i g h t right right,分别指向数组的起始和结束位置;
  • Step2:计算中间元素的索引: m i d = ( l e f t + r i g h t ) / 2 mid = (left + right) / 2 mid=(left+right)/2;
  • Step3:如果 n u m s [ m i d ] < n u m s [ r i g h t ] nums[mid] < nums[right] nums[mid]<nums[right],说明区间 ( m i d , r i g h t ] (mid, right] (mid,right]均为最小值右边的元素,故移除,更新 r i g h t = m i d right=mid right=mid,而 m i d mid mid可能为最小值,因此更新区间时不能舍弃 m i d mid mid;
  • Step4:否则(即 n u m s [ m i d ] > = n u m s [ r i g h t ] nums[mid]>=nums[right] nums[mid]>=nums[right]),说明区间 [ l e f t , m i d ] [left,mid] [left,mid]均为最小值左边的元素,故移除,更新 l e f t = m i d + 1 left=mid+1 left=mid+1,此时 m i d mid mid值不可能为最小值,因为其已经大于了结尾值,故可舍弃 m i d mid mid;
  • Step5:当指针left小于right时,重复步骤Step2_Step5;
  • Step6:否则循环结束,返回 n u m s [ l e f t ] nums[left] nums[left]。

3.代码实现

3.1 Python

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] < nums[right]:
                right = mid
            else:
                left = mid + 1
        return nums[left]

在这里插入图片描述

3.2 Java

class Solution {
    public int findMin(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left <right){
            int mid = (left + right) / 2;
            if (nums[mid] < nums[right]){right = mid;}
            else{left = mid + 1;}
        }
        return nums[left];
    }
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。

标签:153,right,nums,mid,最小值,tail,排序,left
From: https://blog.csdn.net/weixin_38979465/article/details/140137381

相关文章

  • 常见排序原理及 python 实现
    时间复杂度与空间复杂度常用O(1)或O(n)表示,其中1表示一个单位(最简单的单位,可以是多个或1个,但在时间上总体是较低且连续的),时间通常指的是程序运行时间,空间则是指程序在运行时所占用的内存空间。各个阶段的复杂度可用下面的顺序比较:O(1)<O(logn)<O(n)<O(nlogn)<O(n2).......
  • 排序算法
    排序算法的整理和比较。一、基本概念  排序算法就是将一序列对象根据某个关键字进行排序。各个排序算法的时间复杂度和空间复杂度不尽相同,所需的条件和适用范围也不同。一般根据元素的相对位置分为稳定排序算法和非稳定的排序算法。也可根据执行情况分为内排序和外排序。另......
  • 手写排序
    '''C++std::vectorarr;//插入排序//时间复杂度n^2voidinsertSort(vector&arr){intlen=arr.size();for(inti=1;i<len;i++){intv=arr[i],j;for(j=i-1;v<arr[j]&&j>=0;j--){arr[j+1]=arr[j];}arr[j+1]=v;}}//选择排序......
  • 随机生成50个0-100之间的数字,生成对应个数的随机字母,再按数字大小从小到大排序最后写
    importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Random;importjava.io.FileNotFoundException;importjava.io.PrintStream;publicclassRandomNum{publicstaticvoidmain(String[]args)throwsFileNotF......
  • JavaScript 编程语言【 数据类型】过滤|排序|映射|迭代
    文章目录将border-left-width转换成borderLeftWidth过滤范围原位(inplace)过滤范围降序排列复制和排序数组创建一个可扩展的calculator映射到names映射到对象按年龄对用户排序随机排列数组获取平均年龄数组去重从数组创建键(值)对象Iterableobject(可迭代对象)Symbol.......
  • 【算法探险】在排序数组中查找元素的第一个和最后一个位置
    【算法探险】在排序数组中查找元素的第一个和最后一个位置一、引言:算法界的寻宝图二、技术概述:双剑合璧,左右逢源定义与核心特性优势代码示例:初露锋芒三、技术细节:抽丝剥茧,揭秘算法奥秘原理解析难点剖析四、实战应用:数字海洋,定位精准应用场景案例展示五、优化与改进:精......
  • paddleocr识别表格文字内容,对表格内容进行从左上到右下排序
    背景:使用paddleocr识别表格图片文字内容,但是由于图片拍摄或扫描角度问题,不一定是水平平衡的,可能存在一定的倾斜角度。所以如果是仅按坐标从左上到右下进行排序的话,可能本来同一行的文字,被切分成了上下行。因此需要使用阈值来进行近似判断。下面就是一个可用例子。defsort_to......
  • 【408考点之数据结构】排序的基本概念
    排序的基本概念排序是计算机科学中的一个基本操作,目的是将一组无序的数据元素按照特定的顺序排列起来。排序在数据管理、检索和分析中有着广泛的应用,能够提高数据处理的效率和准确性。1.排序的定义排序(Sorting)是指将一组记录按某个关键字或多个关键字的大小关系进行排列......
  • 蓝桥杯python数组排序
    题目:资源限制内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200输入格式第一行为一个整数n。第二行包含n个整数,为待排序的数,每个整数的绝对值小于1......
  • (线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改
    题意:code:#pragmaGCCoptimize("O3")#pragmaGCCoptimize("Ofast")#pragmaGCCoptimize("unroll-loops")#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingu64=unsignedlonglong;usingPII=p......