当前位置: 首页 > news >正文

leetcode33.搜索旋转排序数组-medium

1. 题目:搜索旋转排序数组

官方标定长度:中

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

提示:

1 < = n u m s . l e n g t h < = 5000 1 <= nums.length <= 5000 1<=nums.length<=5000
− 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
− 1 0 4 < = t a r g e t < = 1 0 4 -10^4 <= target <= 10^4 104<=target<=104

2 solution

一个比较简单的处理方式,先用二分法找到旋转的位置,然后再用二分法查找搜索

代码

int search(vector<int> &nums, int target) {
    int left = 0, right = nums.size() - 1;
    int shift = 0;

    while (left <= right){
        if(nums[left] < nums[right] || left == right){
            shift = left;
            break;
        }

        int mid = (right + left) / 2;

        //cout << mid << " " << left << " " << right << endl;

        if(nums[mid] >= nums[left]){
            left = mid + 1;
        }else{
            right = mid;
        }
    }
    cout << shift;

    auto p = lower_bound(nums.begin(), nums.begin() + shift, target);
    if(p!= nums.end() && *p == target) return p - nums.begin();
    p = lower_bound(nums.begin() + shift, nums.end(), target);
    if(p!= nums.end() && *p == target) return p - nums.begin();
    return -1;
}

结果

在这里插入图片描述

相关文章:

  • 【八股文】volatile关键字的底层原理是什么
  • 实现搜索功能:第一部分
  • 穿越是时空之门(java)
  • Ubuntu安装TensorFlow 2.13-GPU版全流程指南(anaconda)
  • golang中的接口
  • 【Java进阶学习 第九篇】常用API(Array、冒泡选择排序、二分查找、正则表达式)
  • 【C++进阶】指针:从基础到实践
  • Leetcode Hot 100 79.单词搜索
  • 【spring对bean Singleton和Prototype的管理流程】
  • 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析
  • 小程序开发中的安全问题及防护措施
  • 蓝桥与力扣刷题(蓝桥 组队)
  • E1-相亲派对(组合)
  • 【AI News | 20250319】每日AI进展
  • @Resource和@Autowire
  • Java 中 LinkedList 的底层数据结构及相关分析
  • 【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)
  • UE4学习笔记 FPS游戏制作6 添加枪口特效
  • 详细解析GetOpenFileName()
  • Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元
  • 威尼斯建筑双年展总策划:山的另一边有什么在等着我们
  • 人民日报钟声:通过平等对话协商解决分歧的重要一步
  • 新闻1+1丨婚姻登记服务,如何跑出幸福加速度?
  • “降息潮”延续,多家民营银行下调存款利率
  • 马上评丨为护士减负,不妨破除论文“硬指标”