leetcode 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

解析:

取数组正中间的数字nums[m] < nums[end], 那么nums[m]以右是有序的, 只需要判断target是否〈=nums[end]就可以决定保留nums[m]左侧子数组或者右侧,而nums[m]>=nums[end]时, nums[m]左侧一定是有序的, 判断target 是否 >= nums[start] 就可以决定保留那半边子数组

 1 int search(vector<int>& nums, int target) {
 2     int s = 0, e = nums.size()-1;
 3     int m;
 4     while(s<=e)
 5     {
 6         m = (e + s) /2;
 7         if(nums[m] == target)
 8             return m;
 9         else if(nums[m] < nums[e])
10         {
11             if(target > nums[m] && target <= nums[e])
12                 s = m+1;
13             else
14                 e = m-1;
15         }
16        else
17         {
18             if(target < nums[m] && target >= nums[s])
19                 e = m-1;
20             else
21                 s = m+1;
22         }
23         
24     }
25     return -1;
26 }

 

posted @ 2018-11-20 10:11  不想取名字所以就随便写了  阅读(247)  评论(0编辑  收藏  举报