C++ 旋转数组查找

给定一个排序数组nums(nums中无重复元素),且nums可能以某个未知下标旋转,给定目标值target,求target是否在nums中出现,若出现返回所在下标,未出现返回-1。

原数组:
[1,3,6,7,9,12,15,20]
可能的旋转结果:
[3,6,7,9,12,15,20,1]
[6,7,9,12,15,20,1,3]
[7,9,12,15,20,1,3,6]
[9,12,15,20,1,3,6,7]
[12,15,20,1,3,6,7,9]
[15,20,1,3,6,7,9,12]
[20,1,3,6,7,9,12,15]

该题就是需要对各种可能的情况进行一一讨论。

#include<vector>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 int search(std::vector<int> &nums, int target)
 {
  int begin = 0;
  int end = nums.size() - 1;
  while (begin<=end)
  {
   int mid = (begin + end) / 2;
   if (target==nums[mid])
   {
    return mid;
   }
   else if (target<nums[mid])
   {
    if (nums[begin]<nums[mid])
    {
     if (nums[begin]<=target)
     {
      end = mid - 1;
     }
     else
     {
      begin = mid + 1;
     }
    }
    else if (nums[begin]>nums[mid])
    {
     end = mid - 1;
    }
    else if (nums[begin]==nums[mid])
    {
     begin = mid + 1;
    }
   }
   else if (target>nums[mid])
   {
    if (nums[begin] < nums[mid])
    {
     begin = mid + 1;
    }
    else if (nums[begin] > nums[mid])
    {
     if (nums[begin]>target)
     {
      begin = mid + 1;
     }
     else if (nums[begin]<=target)
     {
      end = mid - 1;
     }
    }
    else if (nums[begin] == nums[mid])
    {
     begin = mid + 1;
    }
   }
  }
  return -1;
 }
};
int main()
{
 int test[] = {9,12,15,20,1,3,6,7};
 std::vector<int> nums;
 Solution solve;
 for (int i = 0; i < sizeof(test)/sizeof(test[0]); i++)
 {
  nums.push_back(test[i]);
 }
 for (int  i = 0; i < 22; i++)
 {
  printf("%d:  %d\n",i, solve.search(nums,i));
 }
 return 0;
}

运行结果为:

0:  -1
1:  4
2:  -1
3:  5
4:  -1
5:  -1
6:  6
7:  7
8:  -1
9:  0
10:  -1
11:  -1
12:  1
13:  -1
14:  -1
15:  2
16:  -1
17:  -1
18:  -1
19:  -1
20:  3
21:  -1
发布了79 篇原创文章 · 获赞 62 · 访问量 2208

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104969364