33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -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

题解

暴力法

乍一看就是暴力法 但是题目要求O(logn)的时间复杂度 暴力出来是O(n)

但是这题的测试用例有点少 暴力也能ac 并且用时击败80% 内存击败100%

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

在从暴力法优化时想到可以通过第一个数组的值进行取余直接算坐标 这样复杂度才O(1) 但是题目给的数据也看出来只有有序的规律 没有全排列所有数字都存在的规律

二分

题目要求的时间复杂度就是在提示用二分法

思路也相对好理解 把整体总是分成一半一半来判断 但要注意的是二分只在有序序列中使用 所以每次需要先判断哪一部分是有序的 在有序的中判断target是否属于 如果属于则继续二分 如果不属于 则再另一半暂时无序(其中必存在有序)的队列中划分出有序序列用同样的方法

class Solution {
public:
int search(vector<int>& nums, int target) {
int n = (int)nums.size();
if (!n) return -1; // 特判 不存在时和下面就一个元素时
if (n == 1) return nums[0] == target ? 0 : -1; // 三目运算
int l = 0, r = n - 1; // l为左 r为右
while (l <= r) { // 跳出条件 左坐标 > 右坐标时
int mid = (l + r) / 2; // 取中位
if (nums[mid] == target) return mid; // 恰好中位就是target时
/* 下方if else来判断哪个区间有序 决定在哪个区间搜索 并抛弃另一边 */
if (nums[0] <= nums[mid]) { // 中位左边区间有序
if (nums[0] <= target && target < nums[mid]) {// target如果在此区间 则继续二分
r = mid - 1;
} else { // 不在左区间 则从右区间二分寻找
l = mid + 1;
}
} else { // 中位右边区间有序
if (nums[mid] < target && target <= nums[n - 1]) {
l = mid + 1; // 和上方左区间有序一样操作
} else {
r = mid - 1;
}
}
}
return -1;
}
};

力扣Leetcode 33. 搜索旋转排序数组的更多相关文章

  1. Java实现 LeetCode 33 搜索旋转排序数组

    33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...

  2. [leetcode] 33. 搜索旋转排序数组(Java)

    33. 搜索旋转排序数组 说实话这题我连题都没有看懂....真是醉了 二分,没意思,直接交了- - https://www.jiuzhang.com/solutions/search-in-rotat ...

  3. leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II

    33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...

  4. LeetCode 33 - 搜索旋转排序数组 - [二分]

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  5. LeetCode 33 搜索旋转排序数组

    题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个 ...

  6. [LeetCode]33. 搜索旋转排序数组(二分)

    题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ...

  7. LeetCode 33——搜索旋转排序数组

    1. 题目 2. 解答 2.1. 方法一 直接进行二分查找,在判断查找方向的时候详细分类. 当 nums[mid] < target 时, 若 nums[left] <= nums[mid ...

  8. leetcode 33搜索旋转排序数组

    暴力解法:O(n) 想办法用二分查找Ologn

  9. LeetCode 81——搜索旋转排序数组 II

    1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ...

随机推荐

  1. PHP strip_whitespace() 函数

    实例 返回已删除 PHP 注释以及空白字符的 "test.php" 文件的源代码: <?php// PHP comment /** Another PHP comment*/ ...

  2. sql developer连接mysql数据库

    1 首先打开sql developer ,选择上方菜单,工具(tools)--->首选项,如下图 2  数据库(database)--->第三方 JDBC驱动程序 ; “添加条目”,选择m ...

  3. dos下mybatis自动生成代码

    今天来介绍下怎么用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件,这样我们可以节省一部分精力,把精力放在业务逻辑上. 之前看过很多文章 ...

  4. 038_go语言中的状态协程

    代码演示: package main import ( "fmt" "math/rand" "sync/atomic" "time ...

  5. SpringBoot+Mybatis关于开启驼峰映射的设置

    mybatis自定义的SQL语句中,如select语句,如果数据库表的字段为驼峰命名,即如img_address这样的形式,那么select语句执行的结果会变成null. 解决办法是在配置文件中加上开 ...

  6. Kibana配置nginx反代并本地ca加密nginx

    简介 我们部署完ELK Stack后,虽然可以直接浏览器访问kibana进行访问,但这样对一些重要数据来说是不安全的,可以利用密码验证设置权限访问,在Kibana所在的服务器上安装Nginx服务,利用 ...

  7. oracle正则表达式语法介绍及实现手机号码匹配方法

    Oracle10g提供了在查询中使用正则表达的功能,它是通过各种支持正则表达式的函数在where子句中实现的.本文将简单的介绍oracle正则表达式常用语法,并通过一个手机特号匹配的例子演示正则表达式 ...

  8. SVN的基本使用

    2020年7月6日 为什么需要版本控制? 需要清晰地保存某些文件的不同修订版本 控制文件的发屐过程,找出导致 BUG 的原因 轻松将项目或文件恢复到指定版本 极大方便团队之间协同开发,防止出现混乱 在 ...

  9. 深度学习 | sklearn的train_test_split()各函数参数含义解释(超级全)

    在机器学习中,我们通常将原始数据按照比例分割为"测试集"和"训练集",从 sklearn.model_selection 中调用train_test_split ...

  10. vue 父子之间传值

    1:父组件 子组件 子组件利用 props 接收父级传过来的数值.子组件选中的数值返回父亲当中利用 钩子函数 $emit('函数名',传过去的数值)