/***********************************************************************
33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order 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.
eg:
0 1 2 3 4//右边有序情况
4 0 1 2 3//右边有序情况
3 4 0 1 2//右边有序情况
2 3 4 0 1//左边有序情况
1 2 3 4 0//左边有序情况
**************************************************************/
//代码提交1 //循环法---查找 int search(int* nums, int numsSize, int target) { int Left= 0; int Right = numsSize - 1; int Middle; while (Left <= Right) { Middle = (Left + Right) / 2; if (target == *(nums + Middle)) { return Middle; } if (*(nums + Middle) < *(nums + Right)) {//右边有序情况 //1.把目标在限制死在中间值的 右边 if (*(nums + Middle) < target && *(nums + Right) >= target) Left = Middle + 1; //2.其他情况则目标在中间值的 左边 else Right = Middle - 1; continue; } if (*(nums + Middle) > *(nums + Right)) {//左边有序情况 //1.把目标限制死在中间值的 左边 if (*(nums + Middle) > target && *(nums + Right) < target) Right = Middle - 1; //2.其他情况则目标在中间值的 右边 else Left = Middle + 1; continue; } return -1; } return -1; }
//代码提交2 //递归法---查找 int searchFun(int* nums, int nLeft,int nRight,int ntargrt) { int Left = nLeft; int Right = nRight; int Middle = (Left + Right) / 2; if (Left <= Right) { if (*(nums + Middle) == ntargrt) { return Middle; } if (*(nums + Middle) < *(nums + Right)) { if (*(nums + Middle) < ntargrt && ntargrt <= *(nums + Right)) { Left = Middle + 1; return searchFun(nums,Left,Right,ntargrt); } else { Right = Middle - 1; return searchFun(nums, Left, Right, ntargrt); } } if (*(nums + Middle) > *(nums + Right)) { if (*(nums + Middle) > ntargrt && ntargrt > *(nums + Right)) { Right = Middle - 1; return searchFun(nums, Left, Right, ntargrt); } else { Left = Middle + 1; return searchFun(nums, Left, Right, ntargrt); } } return -1; } return -1; } int search(int* nums, int numsSize, int target) { int Left = 0; int Right = numsSize - 1; int resultNum = searchFun(nums,Left,Right,target); return resultNum; }