leetcode-二分搜索:Search in Rotated Sorted Array

题目介绍

在一个部分排序的数组中,查找目标值。部分排序的数组的形式如下

0,1,2,3,4,5,6,7->4,5,6,7,0,1,2

如果搜索到目标值则返回目标值的索引,否则返回-1

思路:

  • 首先找到临界的索引index,例如什么的例子中的临界索引为3
  • 判断目标值所在的区间是[0,index], 还是在[index+1, N]
  • 在含有目标值的区间内使用二分搜索

代码如下

/************************************************************************* > File Name: bisearch.cpp > Author: ma6174 > Mail: [email protected] > Created Time: 2015年07月13日 星期一 10时47分30秒 ************************************************************************/

#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<string>

using namespace std;

//33
int search(vector<int>& nums, int tar)
{
    int piv = 0;
    int N = (int)nums.size() - 1;
    for(piv = 0; piv < N; piv++)
    {
        if(nums[piv] > nums[piv + 1])
            break;
    }
    int i, j;
    if((nums[0] <= tar) && (nums[piv] >= tar))
    {
        i = 0;
        j = piv;
    }
    if((nums[piv + 1] <= tar) && (nums[N] >= tar))
    {
        i = piv + 1;
        j = N;
    }
    while(i <= j)
    {
        int mid = (i + j) / 2;
        if(nums[mid] > tar)
            j = mid - 1;
        else if(nums[mid] < tar)
            i = mid + 1;
        else
            return mid;
    }
    return -1;
}
int main(int arvc, char** argv)
{
    int in = atoi(argv[1]);
    vector<int> r;
    r.push_back(4); r.push_back(5); r.push_back(6); r.push_back(7); r.push_back(0); r.push_back(1); r.push_back(2);
    int id = search(r, in);
    printf("id = %d\n", id);
    return 0;
}

你可能感兴趣的:(LeetCode)