【问题描述】[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

【解答思路】

1. 暴力法 (不符合题意)

时间复杂度:O(N) 空间复杂度:O(1)

public class Solution {public int search(int[] nums, int target) {int len = nums.length;for (int i = 0; i < len; i++) {if (nums[i] == target) {return i;}}return -1;}
}
2. 二分查找 修改版

时间复杂度:O(logN) 空间复杂度:O(1)

  public int search(int[] nums, int target) {int left= 0;int right =  nums.length-1;while(left <=right){int mid =  (right - left ) /2 +left;if(target == nums[mid] ){return mid;}先根据 nums[mid] 与 nums[lo] 的关系判断 mid 是在左段还是右段 if(nums[mid] <nums[right]){if (nums[mid] <= target && target <= nums[right]) {// 下一轮搜索区间是 [mid+1, right]left = mid+1;} else {// 只要上面对了,这个区间是上面区间的反面区间,下一轮搜索区间是 [left, mid - 1]right = mid - 1;}}else{
// [left, mid] 有序,但是为了和上一个 if 有同样的收缩行为,// 当区间只有 2 个元素的时候 int mid = (left + right + 1) >>> 1; 一定会取到右边// 此时 mid - 1 不会越界,就是这么刚刚好if (nums[left] <= target && target <= nums[mid]) {/// 下一轮搜索区间是 [left, mid - 1]right = mid-1;} else {// 下一轮搜索区间是 [mid+1, right]left = mid+1;}}}return -1 ;}
3. 有序数组查找目标值 + 二分查找

class Solution {public int search(int[] nums, int target) {int lo = 0, hi = nums.length - 1;while (lo <= hi) {int mid = lo + (hi - lo) / 2;if (nums[mid] == target) {return mid;}// 先根据 nums[0] 与 target 的关系判断目标值是在左半段还是右半段if (target >= nums[0]) {// 目标值在左半段时,若 mid 在右半段,则将 mid 索引的值改成 infif (nums[mid] < nums[0]) {nums[mid] = Integer.MAX_VALUE;}} else {// 目标值在右半段时,若 mid 在左半段,则将 mid 索引的值改成 -infif (nums[mid] >= nums[0]) {nums[mid] = Integer.MIN_VALUE;}}if (nums[mid] < target) {lo = mid + 1;} else {hi = mid - 1;}}return -1;}
}

【总结】

1. 二分查找模板[详解链接]
int binary_search(int[] nums, int target) {int left = 0, right = nums.length - 1;
//  <=while(left <= right) {int mid = left + (right - left) / 2;//防止大数溢出if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1; } else if(nums[mid] == target) {// 直接返回return mid;}}// 直接返回return -1;
}
2. 排除法找规律分析 不要想着一蹴而就
  • 有序增长的部分分开思考 一蹴而就
  • if -else 好想的条件放进if 其余else
3. 该有的模板初期要不断总结 根据模板发散思考 切忌想当然

[Leedcode][JAVA][第33题][搜索旋转排序数组]相关推荐

  1. 《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

    <LeetCode力扣练习>第33题 搜索旋转排序数组 Java 一.资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下 ...

  2. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)

    思路:利用vector变长特性,将前面旋转的部分移到后面,然后二分查找,O(logn)复杂度 int search(vector<int> &nums, int target) { ...

  3. leetcode算法题--搜索旋转排序数组

    原题链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 此题的特点是,以mid为中点,肯定有一半是有序的 首先判断t ...

  4. 【LeetCode - 33】搜索旋转排序数组(二分)

    力扣 解题报告: 二分.但是有不少细节要考虑清楚. 所以干脆考虑另一种二分的方式.也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量+取模完成.这样就不需 ...

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

    LeetCode高频题33. 搜索旋转排序数组 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...

  6. LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置

    前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...

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

    33. 搜索旋转排序数组 三个测试用例, 这个题的难度是二分法的左侧条件很难写出来. 4 5 6 0 1 2 3 1 2 3 4 5 6 0 5 1 2 3 4 ( 例如,数组 [0,1,2,4,5, ...

  8. ​LeetCode刷题实战81:搜索旋转排序数组 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

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

    33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...

最新文章

  1. 可能是 nginx 限速最容易理解的说明
  2. Java反编译工具-JD-GUI解决直接打开.class文件卡顿问题
  3. PostgreSQL 10.1 手册_部分 I. 教程_第 2 章 SQL语言
  4. 【强化学习】MOVE37-Introduction(导论)/马尔科夫链/马尔科夫决策过程
  5. SAGAN(G-lab介绍)
  6. Android studio Mac 版  Plugin Error Plugin “GsonFormat4DataBinding“ is incompatible
  7. android随机数方法,Android生成随机数的方法实例
  8. 中国团队屠榜:COCOMapillary挑战赛包揽全部冠军
  9. Mybatis 中文文档
  10. 角度计算公式 角度换算 想知道1是多少度; 度和弧度的关系 弧微分: 曲率,曲半径,曲率圆:
  11. 【每日一具10】磁力资源搜索助手特别版
  12. 如何摆脱CRUD等打杂状态,从事更高价值工作
  13. linux wifi6,WIFI6 基本知识(一)
  14. win10蓝牙鼠标、耳机无法连接,无蓝牙开关标志解决方案
  15. UI设计从业者,怎样才能成为月薪过万的UI设计师?
  16. 那些年,我们一起做过的 Java 课后练习题(26 - 30)
  17. dashboard的yaml配置文件
  18. vue+PHP+MySQL
  19. 为什么很多企业都在使用短信群发?原来是有3大好处!
  20. 关于调用淘宝IP获取城市信息-- 随笔

热门文章

  1. Delphi iOS 开启文件共享 UIFileSharingEnabled
  2. CSUOJ 1196- Staginner 去爬山
  3. 计算机二级C语言考的函数,【帮考网】2012计算机等级二级考试C语言:函数递归...
  4. apache 修改服务器配置,Apache服务器配置全攻略
  5. 微信小程序登录 更新中
  6. CDH集群异常处理ERROR  Failure due to stall on seeded torrent.、重装时hdfs提示目录已存在、CDH重启不正常
  7. html4废弃了哪些元素,HTML中的一些废弃元素_html
  8. django设置超级管理员_Django的简介与安装
  9. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法
  10. MySQL数据库事务中的行级锁,表级锁,页级锁