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

力扣·33. 搜索旋转排序数组

时间:2024-07-14 10:30:22浏览次数:12  
标签:target nums 33 mid 力扣 数组 区间 排序 left

1.题目

题目地址(33. 搜索旋转排序数组 - 力扣(LeetCode))

https://leetcode.cn/problems/search-in-rotated-sorted-array/

题目描述

整数数组 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:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:

输入:nums = [1], target = 0
输出:-1

 

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • nums 中的每个值都 独一无二
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

2.题解

2.1 二分查找

思路

定理一:只有在顺序区间内才可以通过区间两端的数值判断target是否在其中。
定理二:判断顺序区间还是乱序区间,只需要对比 left 和 right 是否是顺序对即可(这里没有重复元素),left <= right,顺序区间,否则乱序区间。
定理三:每次二分都会至少存在一个顺序区间。(由于区间部分有序,即两个由于区间组成,无论怎么分,总有一个区间是这两个区间的一个子区间)

所以我们只要每次通过判断:1.区间是否有序 2.在有序区间内判断target是否在其中,在的话继续在该区间二分,不在的话去无序区间进行二分
最终就可以找到相应target的位置

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1;
        while(left <= right){
            int mid = (right - left) / 2 + left;
            if(target == nums[mid]) return mid;
            if(nums[left] <= nums[mid]){
                if(target < nums[mid] && target >= nums[left]){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }else{
                if(target <= nums[right] && target > nums[mid]){
                    left = mid + 1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(log_2n)\)
  • 空间复杂度:\(O(n)\)

标签:target,nums,33,mid,力扣,数组,区间,排序,left
From: https://www.cnblogs.com/trmbh12/p/18301142

相关文章

  • js实现归并排序算法
    在JavaScript中实现归并排序可以通过递归的方式完成。归并排序使用了“分而治之”的策略,将数组递归地分成两个子数组,分别进行排序,然后将它们合并成一个有序数组。以下是一个简单的归并排序实现:functionmergeSort(arr){//如果数组只有一个元素或为空,则直接返回数组......
  • js实现快速排序算法
    在JavaScript中实现快速排序可以通过递归方式来完成。下面是一个示例代码:functionquickSort(arr){//如果数组为空或只有一个元素,则无需排序if(arr.length<=1){returnarr;}//选择基准元素(这里选择中间元素)constpivotIndex=Math.fl......
  • 【配电网重构】高比例清洁能源接入下计及需求响应的配电网重构【IEEE33节点】(Matlab代
    ......
  • 基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
    ......
  • luoguP3533 lca
    [POI2012]RAN-Rendezvous题目描述ByteasarisarangerwhoworksintheArrowCave-afamousrendezvousdestinationamonglovers.Thecaveconsistsof\(n\)chambersconnectedwithone-waycorridors.Ineachchamberexactlyoneoutgoingcorridorismarked......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II是一个有序链表错误代码classSolution{publicListNodedeleteDuplicates(ListNodehead){ListNodedummy=newListNode();dummy.next=head;while(head!=null&&head.next!=null){i......
  • java数组之冒泡排序、快速排序
    一、排序算法概述1.算法定义排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。通常来说,排序的目的是快速查找。2.衡量排序算......
  • 希尔排序--插入排序升级版
    #include<stdio.h>//希尔排序函数voidshellSort(intarr[],intsize){inti,j,gap,temp;//计算初始增量gap=1;while(gap<size){gap=gap*3+1;//Knuth增量序列for(i=gap;i<size;i++){//当前待插......
  • 热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网33
           热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网10       热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网    ......
  • 力扣-278. 第一个错误的版本
    1.题目题目地址(278.第一个错误的版本-力扣(LeetCode))https://leetcode.cn/problems/first-bad-version/题目描述你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所......