LeetCode-33.Search in Rotated Sorted Array
2016-07-18 22:38
381 查看
https://leetcode.com/problems/search-in-rotated-sorted-array/
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
方法一
转化为题LeetCode-153.Find Minimum in Rotated Sorted Array
找到数组中的min,然后分别在左右子数组中用二分查找
方法二
只使用一次二分
1、如果target == nums[mid],直接返回mid
2、如果nums[l] <= nums[mid],则说明l到mid一定是有序的,判断target是否在l到mid之间
3、如果nums[l] > nums[mid],则说明mid到r一定是有序的,判断target是否在mid到r之间
int search(vector<int>& nums, int target)
{
int n = nums.size();
if (n == 0)
return -1;
int l = 0, r = n - 1, mid;
while (l <= r)
{
mid = l + (r - l) / 2;
if (target == nums[mid])
return mid;
if (nums[l] <= nums[mid])
{
if (target < nums[mid]&&target>=nums[l])
r = mid - 1;
else
l = mid + 1;
}
else
{
if (target > nums[mid]&&target<nums[l])
l = mid + 1;
else
r = mid - 1;
}
}
return -1;
}
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might 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.
You may assume no duplicate exists in the array.
方法一
转化为题LeetCode-153.Find Minimum in Rotated Sorted Array
找到数组中的min,然后分别在左右子数组中用二分查找
class Solution { public: int helper(vector<int>& nums, int l, int r,int target) { int mid; while (l <= r) { mid = l + (r - l) / 2; if (target == nums[mid]) return mid; if (target > nums[mid]) l = mid + 1; else r = mid - 1; } return -1; } int search(vector<int>& nums, int target) { int n = nums.size(); if (n == 0) return -1; if (nums[0] <= nums[n - 1]) return helper(nums, 0, n - 1,target); int l = 0, r = n - 1, mid; while (l < r) { mid = l + (r - l) / 2; if (target == nums[mid]) return mid; if (nums[l] < nums[r]) break; if (nums[l] <= nums[mid]) l = mid + 1; else r = mid; } int res= helper(nums, 0, l-1, target); if (res != -1) return res; return helper(nums, l, n-1, target); } };
方法二
只使用一次二分
1、如果target == nums[mid],直接返回mid
2、如果nums[l] <= nums[mid],则说明l到mid一定是有序的,判断target是否在l到mid之间
3、如果nums[l] > nums[mid],则说明mid到r一定是有序的,判断target是否在mid到r之间
int search(vector<int>& nums, int target)
{
int n = nums.size();
if (n == 0)
return -1;
int l = 0, r = n - 1, mid;
while (l <= r)
{
mid = l + (r - l) / 2;
if (target == nums[mid])
return mid;
if (nums[l] <= nums[mid])
{
if (target < nums[mid]&&target>=nums[l])
r = mid - 1;
else
l = mid + 1;
}
else
{
if (target > nums[mid]&&target<nums[l])
l = mid + 1;
else
r = mid - 1;
}
}
return -1;
}
相关文章推荐
- C++二分法在数组中查找关键字的方法
- php二分法在IP地址查询中的应用
- Python实现二分法算法实例
- Python二分法搜索算法实例分析
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- 八大方法巧妙排除网络连接故障
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02