一.题意描述

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

数组中可能存在重复数字。

二.解题思路

与简单的二分查找相比,这道题需要多处理一个问题。因为数组是旋转过的排序数组,例如【5 6 6 7 1 2 3 3 4】,那么7为这一数组中的间断点,间断点两侧的数组都是排好序的数组,所以可以直接对这两部分的数组直接使用二分查找。

那么如何找到间断点?我们注意到间断点7大于等于数组中的首个节点5,间断点的下一个节点1小于等于首个节点5,事实上这也正是间断点的特点,我们可以依据这一特点对原数组进行二分查找,直至找到间断点。

在查找间断点的过程中需要注意一个问题,例如数组【1 3 1 1 1】(这也是LeetCode上的一个易错样例),这个数组的中间点1等于第一个点1,他的下一个节点1也等于第一个节点1,然而中间点却并不是间断点。这是一种特殊情况,在这种情况下需要手动将起始节点向后挪动一个,再继续进行二分查找。

在找到间断点之后,判断target数组出现在间断点的左区间还是右区间,问题退化成普通的二分查找,不再赘述。

三.代码实现

class Solution {
public:int findPivot(vector<int>& nums)         //查找中间点的函数{int start = 0;int end = nums.size() - 1;int mid;while(1){int mid = (start + end) / 2;if(start == end)return mid;if(end == start+1){if(nums[end] < nums[start])return start;elsereturn end;}if(nums[mid] == nums[start] && nums[mid + 1] == nums[start])      //上文中需要特判的情况{start++;continue;}else if(nums[mid] >= nums[start] && nums[mid + 1] <= nums[start]){return mid;}else if(nums[mid] < nums[start]){end = mid - 1;continue;}else{start = mid + 1;continue;}}}bool binarySearch(vector<int>& nums, int start, int end, int target)        //普通的二分查找函数{if(end < start)return 0;int mid = (start + end) / 2;if(target == nums[mid])return 1;else if(target < nums[mid])return binarySearch(nums, start, mid - 1, target);elsereturn binarySearch(nums, mid + 1, end, target);}bool search(vector<int>& nums, int target) {int pivot = findPivot(nums);if(!nums.size())return 0;if(target >= nums[0])return binarySearch(nums, 0, pivot, target);elsereturn binarySearch(nums, pivot + 1, nums.size()-1, target);}
};

  

转载于:https://www.cnblogs.com/tiezhibieek/p/5062069.html

LeetCode-Search In Rotated Sorted Array2题解相关推荐

  1. LeetCode Search in Rotated Sorted Array II

     Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...

  2. LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  3. leetcode - Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  4. [leetcode]Search in Rotated Sorted Array II

    这道题目仍然是二分,去掉不可能的部分.用了递归,在重复的情况下,就是有可能最左边的和最右边的相等,此时就不能直接判断出区间外的元素,左右两边同时递归.有重复元素的时候,在bad case的时候会退化为 ...

  5. leetcode:Search in Rotated Sorted Array

    题目要求: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...

  6. [leetcode]Search in Rotated Sorted Array @ Python

    原题地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/ 题意: Suppose a sorted array is ...

  7. [LeetCode] Search in Rotated Sorted Array

    二分 : 判断条件 当a[left] <= a[mid]时,可以肯定a[left..mid]是升序的 循环有序 一共有以下两种情况 第一种  / / / / / / 条件: (A[mid] &g ...

  8. LeetCode 33. Search in Rotated Sorted Array

    问题链接 LeetCode 33. Search in Rotated Sorted Array 题目解析 给定一个 "升序" 的 无重复 数组,从中寻找目标值."升序& ...

  9. 【leetcode】Search in Rotated Sorted Array II(middle)☆

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

最新文章

  1. php7.0 连接ftp,PHPstorm连接ftp
  2. 管理的实践-彼得.德鲁克
  3. 14. 不修改数组找出重复的数字【难度: 一般 / 知识点: 抽屉原理 二分】
  4. XSS之xssprotect
  5. SQL SERVER2000将多行查询结果拼接到一行数据及函数的创建
  6. python-scrapy爬虫框架
  7. php中没有dockerfile,Dockerfile在RUN composer install命令中没有使用缓...
  8. php hmac sha256签名,HMAC-SHA256签名错误?
  9. 检查点和oracle数据库的恢复(一)SCN
  10. Kotlin学习笔记25 协程part5 协程的同步与异步
  11. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度
  12. hnu暑期CCF培训之多项式加法
  13. 这本插画式的 Python 书,刚到手就女友抢走了
  14. android程序数据迁移sd,Android将项目中的数据库复制到SD
  15. 【C语言】冒泡排序与回文判断
  16. Mac本终端连接服务器
  17. 一点点读懂cpufreq(一)
  18. Unity 中操作数据文件
  19. 6-26 统计专业人数 (15分)
  20. 服务器2012系统崩溃,意外的Windows服务器2012 R2上的WCF服务崩溃

热门文章

  1. 客户端调用webSerices
  2. Linux系列:Ubuntu/fedora实用小技巧—禁止自动锁屏、设置免密码自动登录、免密码执行sudo操作...
  3. 本案例通过ArrayList集合来显示Collection接口中的共性函数
  4. 北京地铁线路图纯算法附带求极权值(原创) 性能提升版
  5. 不会出现这样的情况吧
  6. 什么是技术,技术是什么
  7. 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
  8. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  9. 笔记本电脑没有鼠标怎么拖动_适合办公鼠标要如何选择?除了便携更需要这些...
  10. Serverless:这真的是未来吗?(一)