首页 > 其他分享 >33. 搜索旋转排序数组

33. 搜索旋转排序数组

时间:2023-09-23 23:05:20浏览次数:38  
标签:下标 target nums 33 mid int 数组 排序 start

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

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

 

示例 1:

4,5,6,7,0,1,2]

示例 2:

4,5,6,7,0,1,2]
class Solution {
    public int search(int[] nums, int target) {
        if (nums.length == 1) {
            if (nums[0] == target) {
                return 0;
            } else {
                return -1;
            }
        }

        int start = 0;
        int end = nums.length - 1;
        int mid = (start + end) / 2;

        while (start <= end) {
            if (nums[mid] == target) {
                return mid;
            }

            // 判断有序区间与无序区间
            if (nums[start] <= nums[mid]) {
                // 前一部分为有序区间,后一部分为无序区间
                // 根据有序区间的特点判断 target 是否在有序区间
                if (target >= nums[start] && target < nums[mid]) {
                    // target 在该区间
                    end = mid - 1;
                } else {
                    // target 不在该区间
                    start = mid + 1;
                }
            } else {
                // 前一部分为无序区间,后一部分为有序区间
                // 根据有序区间的特点判断 target 是否在有序区间
                if (target > nums[mid] && target <= nums[end]) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
            mid = (start + end) / 2;
        }

        return -1;
    }
}

标签:下标,target,nums,33,mid,int,数组,排序,start
From: https://blog.51cto.com/u_15862486/7581400

相关文章

  • 数组操作的方法
    数组操作的方法分为:改变原数组的方法和不改变原数组的方法1.改变原数组的方法vararr=[]arr.splice()arr.reverse()arr.fill()arr.copyWithin()arr.sort()arr.push()arr.pop()arr.unshift()arr.shift()2.不改变原数组的方法......
  • R3300L, Q7 ATV Android9固件
    R3300L,Q7ATVAndroid9固件固件来源https://www.znds.com/tv-1239603-1-1.html之前在恩山上发布过1080p安卓6固件https://www.right.com.cn/forum/thread-1761250-1-1.html,这个固件的不足之处就是没有GoogleServiceFramework,只能通过SmartYoutube之类的第三方APP......
  • 9.23栈的链式和数组实现
    //栈的链表实现importjava.util.Iterator;publicclassMain{publicstaticvoidmain(String[]args){LinkedListStack<Integer>l=newLinkedListStack<>(5);l.push(1);l.push(2);l.push(3);Iterator<Integer&g......
  • JavaScript实现排序算法
    目录前言排序算法冒泡排序选择排序插入排序归并排序快速排序计数排序基数排序桶排序前言排序算法是《数据结构与算法》中最基本的算法之一,本篇使用JavaScript语言实现各种常见排序算法。排序算法冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻......
  • nodejs 字符串、数组、对象之间的相互转换
    vararr=['a','b','李四']varstr=JSON.stringify(arr)console.log(typeofstr)varobj={name:'liuneng',age:56,sex:'女'}varstr1=JSON.stringify(obj)console.log(typeofstr1)//字符串转对象//对字符串要求很高,需要单引号包住双......
  • C 排序
    贪心做好优化,否者超时对于第一位a,它只可能替换成a-1,所以如果在a到a-1的数字内只有a或者a-2,那么a-1就可以取代a。因此我们可以开10个数组来存储每个数字的下标,对于每一位从0开始贪心的枚举每一位,如果有满足的j,那么直接替换,肯定有一个j满足要求(因为它自己肯定满足)。代码里有一......
  • 算法基础之快速排序
    quick_sort方法中如果i=l,j=r会死循环的分析示例代码voidquick_sort(inta[],intl,intr){if(l>=r)return;inti=l,j=r;//此处设置会导致死循环intx=num[(l+r)>>1];while(i<j){while(a[++i]<x);//死循环的地方while(a[--j]>x......
  • springboot 接收前端数组
    前端:(黄色内容为必选项!!!)axios({url:"/access/getArr",method:"post",data:JSON.stringify([1,2,3,4]),headers:{"Content-Type":"application/json",},});后端:@RequestMapping(value=......
  • 启动MySQL数据库时报错"Another process with pid 3306 is using unix socket file…
    问题描述:启动MySQL数据库时报错"Anotherprocesswithpid3306isusingunixsocketfile……",如下所示:数据库:MySQL5.7.211、异常重现2023-09-23T06:09:48.644151Z0[Note]ServersocketcreatedonIP:'::'.2023-09-23T06:09:48.645247Z0[ERROR]Anotherprocessw......
  • 交错数组
    概念交错数组是数组的数组,每个维度的数量可以不同。注意:二维数组的每行的列数相同,交错数组的每行的列数可能不同数组的申明1.变量类型[][] 交错数组名;int[][]arr1;2.变量类型[][] 交错数组名=new变量类型[行数][];int[][]arr1=newint[3][];3.变量类型[][......