当前位置: 首页 > 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;
}

结果

在这里插入图片描述

http://www.dtcms.com/a/77380.html

相关文章:

  • 【八股文】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
  • 基于Arduino控制的温室蔬菜园环境监控系统(论文+源码)
  • python-56-基于Vue和Flask进行前后端分离的项目开发示例实战
  • FPGA学习(二)——基于DE2-115开发板的LED流水灯设计
  • 构建下一代AI Agent:自动化开发与行业落地全解析
  • SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口)(4)
  • <table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。
  • Linux 锁、线程同步