Leetcode : Search in Rotated Sorted Array

来源:互联网 发布:老鼠仓软件 编辑:程序博客网 时间:2024/06/16 01:46

原题:

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.

You may assume no duplicate exists in the array.

题目的意思是说在一个翻转过的数组中搜索一个给定的数字,如果该数字存在则返回该数字的下标,如果不存在则返回-1。数组中的元素是唯一的。

刚开始采用了暴力搜索,时间复杂度为O(n),居然通过了。后来在网上找了一个二分查找的算法,时间复杂度为O(lgn),也通过了。查看两种算法的运行时间居然是一样的,这不科学啊。估计测试数据的量太小的原因。

好了,下面说一下二分搜索算法的思路吧

这个数组有个性质:在翻转轴之前的数字都比之后的数字大.

直接贴代码吧,代码中有详细的注释:

int search(int A[], int n, int target) {int first = 0, last = n;while(first != last){int mid = (first + last)/2;//取中间位置if(A[mid] == target)       //如果找到就直接返回return mid;if(A[first] < A[mid]){     //如果first位置的值小于mid位置的值,说明这之间的数组是有序的if(A[first] <= target && target < A[mid])//如果目标数值位于first和mid之间last = mid;else{                   //如果不在first和mid之间first = mid + 1;}}else{                     //如果first位置的值大于mid位置的值,说明mid位于翻转轴之后,last位置的数大于mid位置的数。                      //也即mid和last之间的数组是有序的if(A[mid] < target && target <= A[last-1]) //目标数据在mid和last之间first = mid + 1;else last = mid;}}return -1;}




0 0