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

33. 搜索旋转排序数组

时间:2025-01-21 13:31:37浏览次数:1  
标签:target nums 33 指针 int 数组 排序 left

整数数组 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 处经旋转后可能变为 [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

解法一:
遍历整个数组

class Solution {
    public int search(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;
    }
}

解法二:
二分搜索

    public int search(int[] nums, int target) {
        // 初始化左右指针
        int left = 0, right = nums.length - 1;
        
        // 当左指针小于等于右指针时,执行循环
        while (left <= right) {
            // 计算中间位置
            int mid = (left + right) / 2;
            
            // 如果中间值等于目标值,返回中间值的索引
            if (nums[mid] == target) return mid;
            
            // 判断左半部分是否有序
            if (nums[mid] >= nums[left]) {
                // 如果目标值在左半部分范围内,则调整右指针
                if (target >= nums[left] && target < nums[mid]) right = mid - 1;
                else left = mid + 1; // 否则调整左指针
            } else {
                // 如果目标值在右半部分范围内,则调整左指针
                if (target > nums[mid] && target <= nums[right]) left = mid + 1;
                else right = mid - 1; // 否则调整右指针
            }
        }
        
        // 如果找不到目标值,返回 -1
        return -1;
    }
}

标签:target,nums,33,指针,int,数组,排序,left
From: https://www.cnblogs.com/promenader1/p/18683454

相关文章

  • C语言中的二维数组
    1.二维数组的定义类型说明符数组名 [常量表达式][常量表达式];(1).类型说明符      表示二维数组中数据元素的类型 (2).数组名          标识符 (3).[常量表达式][常量表达式]      第1维       第2维   ......
  • 树状数组
    Question01[P3374树状数组一]模板题Code#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+7;classTree{ public: inlinevoidscan(longlong*_data,int_size){ size=_size; for(inti=1;i<=size;i++)_data[i]+=_data[i-1]; for(inti......
  • 利用dsp28335的sci模块对esp8266wifi模块进行控制
    利用dsp28335的sci模块对esp8266wifi模块进行控制,将数据发出资源文件列表V1_wifi_send/.ccsproject , 519V1_wifi_send/.cdtbuild , 12372V1_wifi_send/.cdtbuild_initial , 12352V1_wifi_send/.cdtproject , 677V1_wifi_send/.cproject , 21668V1_wifi_send/.la......
  • C语言程序设计十大排序—冒泡排序
    文章目录1.概念✅2.冒泡排序......
  • 5、原来可以这样理解C语言_数组
    目录​编辑1.数组的概念2.⼀维数组的创建和初始化2.1数组创建⼀维数组创建的基本语法如下:2.2数组的初始化2.3数组的类型3.⼀维数组的使⽤ 3.1数组下标3.2数组元素的打印3.3数组的输⼊4.⼀维数组在内存中的存储5.sizeof计算数组元素个数6.⼆维数组......
  • 洛谷 P3397:地毯 ← “二维前缀和 + 二维差分”模板题
    【题目来源】https://www.luogu.com.cn/problem/P3397【题目描述】在n×n的格子上有m个地毯。给出这些地毯的信息,问每个点被多少个地毯覆盖。【输入格式】第一行,两个正整数n,m。意义如题所述。接下来m行,每行两个坐标(x1,y1)和(x2,y2),代表一块地毯,左上角......
  • 树状数组
    l(x)=x-lowbit(x)+1。即,l(x)是c[x]管辖范围的左端点。对于任意正整数x,总能将x表示成s*2^{k+1}+2^k的形式,其中lowbit(x)=2^k。下面「c[x]和c[y]不交」指c[x]的管辖范围和c[y]的管辖范围不相交,即[l(x),x]和[l(y),y]不相交。「c[x]包含于c[y]」......
  • 数据结构-堆及堆排序
    1.堆的定义堆(Heap)是一种数据结构,通常是一个完全二叉树。在堆中,每个节点都有一个与其相关的值,并且满足堆的性质。堆分为两种类型:大堆和小堆。大堆:在大堆中,对于每个非叶子节点,其值都大于或等于它的子节点的值。也就是说,根节点的值是整个堆中的最大值。小堆:与大堆相反,在小堆中,对......
  • 剑指offer面试题3:数组中重复的数字(Python实现)
    """面试题3:数组中重复的数字在一个长度为n的数组里所有数字都在0~n-1的范围内,某些数字是重复的,找出任意一个重复的数字"""defduplicate1(numbers:list,length:int)->int:"""修改原数组"""ifnumbers==[]orlength<=0:......
  • java —— 数组(超详细教程)
    介绍:这期讲的是java的原生数组,也就是list(静态空间),空间是写死的;后期的ArrayList是动态数组。我们需要先认识基础的格式,方便后面的ArrayList学习。一、创建数组(一)方法一:1、先声明,再定义长度。publicstaticvoidmain(String[]args){//声明变量int[......