博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 33——搜索旋转排序数组
阅读量:4950 次
发布时间:2019-06-11

本文共 4824 字,大约阅读时间需要 16 分钟。

1. 题目

1240

2. 解答

2.1. 方法一

直接进行二分查找,在判断查找方向的时候详细分类。

当 nums[mid] < target 时,

  • 若 nums[left] <= nums[mid],此时,target 一定在nums[mid] 右边,继续向右查找。
  • 若 nums[left] > nums[mid] < nums[right],此时 nums[mid] 两边都有较大的元素,我们要进一步确定查找的方向。
    • 若 target <= nums[right],则向右查找。
    • 若 target >= nums[left],则向左查找。
    • 若 nums[right] < target < nums[left],则不存在。

当 nums[mid] > target 时,

  • 若 nums[mid] <= nums[right],此时,target 一定在nums[mid] 左边,继续向左查找。
  • 若 nums[left] <= nums[mid] > nums[right],此时 nums[mid] 两边都有较小的元素,我们要进一步确定查找的方向。
    • 若 target <= nums[right],则向右查找。
    • 若 target >= nums[left],则向左查找。
    • 若 nums[right] < target < nums[left],则不存在。
class Solution {public:           int search(vector
& nums, int target) { if (nums.size() == 0) return -1; // 数组为空 int left = 0; int right = nums.size() - 1; int mid = 0; while(left <= right) { mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { if (nums[left] <= nums[mid]) // l <= m < r { left = mid + 1; } else if (nums[left] > nums[mid] && nums[mid] < nums[right]) { if (nums[left] <= target) { right = mid - 1; } else if (nums[right] >= target) { left = mid + 1; } else { return -1; } } } else { if (nums[mid] <= nums[right]) // = 是只有一个元素的情况 { right = mid - 1; } else if (nums[left] <= nums[mid] && nums[mid] > nums[right]) // = 是因为 mid 等于 left 的情况 { if (nums[left] <= target) { right = mid - 1; } else if (nums[right] >= target) { left = mid + 1; } else { return -1; } } } } return -1;
2.2. 方法二

先利用二分查找确定转折点,然后对转折点两侧的数据分别再进行二分查找。

当 nums[mid] > nums[right] 时,说明 nums[mid] 在转折点左侧,继续向右查找。

当 nums[mid] < nums[right] 时,向左缩小区间,直到 left = right 时,此时 right 即为转折点的位置。

class Solution {public:        int Binary_Search(vector
& nums, int left, int right, int target) { int mid = 0; while(left <= right) { mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if(nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } int search(vector
& nums, int target) { if (nums.size() == 0) return -1; // 数组为空 int left = 0; int right = nums.size() - 1; int mid = 0; while(left < right) { mid = left + (right - left) / 2; if (nums[mid] > nums[right]) { left = mid + 1; } else { right = mid; } } int a = Binary_Search(nums, 0, right-1, target); int b = Binary_Search(nums, right, nums.size() - 1, target); return a > b ? a : b; }};
2.3. 方法三

nums[mid] 要么落在左边升序的数据区间内,要么落在右边升序的数据区间内

当 nums[mid] 在右边升序的数据区间内

  • 若 nums[mid] < target <= nums[right],则向右查找;否则向左查找。

当 nums[mid] 在左边升序的数据区间内

  • 若 nums[left] <= target < nums[mid],则向左查找;否则向右查找。
class Solution {public:    int search(vector
& nums, int target) { int left = 0; int right = nums.size() - 1; int mid = 0; while(left <= right) { mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < nums[right]) // nums[mid] 在右边升序的数据区间内 { if (nums[mid] < target && target <= nums[right]) left = mid + 1; else right = mid - 1; } else // nums[mid] 在左边升序的数据区间内 { if (nums[left] <= target && target < nums[mid]) right = mid - 1; else left = mid + 1; } } return -1; }};

获取更多精彩,请关注「seniusen」!

1240

转载于:https://www.cnblogs.com/seniusen/p/9862288.html

你可能感兴趣的文章
IP通信基础 第八周 第九周总结
查看>>
kali,parrot最新更新debain源
查看>>
平衡树学习笔记(2)-------Treap
查看>>
在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
查看>>
./mosquitto_internal.h:51:12: fatal error: 'ares.h' file not found
查看>>
HDU 1789 Doing Homework again(非常经典的贪心)
查看>>
本机,同机房,同城,异地,不同城,腾讯云ping延时值
查看>>
jQuery小结5
查看>>
i=i+1与i+=1的区别及效率
查看>>
指令——mkdir
查看>>
Server.MapPath
查看>>
WPF日期控件
查看>>
基本的SqlPlus命令
查看>>
oracle 日期比较出现ORA-01861: 文字与格式字符串不匹配问题
查看>>
hibernate_sequence.nextval 序列不存在
查看>>
sqluldr2
查看>>
Oracle Patch Set Update and Critical Patch Update April 2011 Released
查看>>
图论算法之(割点)
查看>>
摄像头工作原理【转】
查看>>
js打乱数组排序
查看>>