/***********************************************************************
33. Search in Rotated Sorted Arraythis
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.spa
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).code
You are given a target value to search. If found in the array return its index, otherwise return -1.blog
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//右邊有序狀況get
2 3 4 0 1//左邊有序狀況
1 2 3 4 0//左邊有序狀況
**************************************************************/it
//代碼提交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 (*(nums + Left) == target) return Left; if (*(nums + Right) == target) return Right; if (*(nums + Middle) == target) return Middle; if (*(nums + Left) < *(nums + Middle)) { if (*(nums + Left) <= target && target < *(nums + Middle)) Right = Middle-1; else Left = Middle + 1; continue; } else { if (*(nums + Middle) < target && target <= *(nums + Right)) Left = Middle + 1; else Right = Middle-1; continue; } } 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; }
/***********************************************************************
81. Search in Rotated Sorted Array IIio
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?function
Would this affect the run-time complexity? How and why?class
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).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
**************************************************************/
bool search(int* nums, int numsSize, int target) { int Left = 0; int Right = numsSize - 1; int Middle; while (Left <= Right) { Middle = (Left + Right) / 2; if (*(nums + Left) == target) return true; if (*(nums + Right) == target) return true; if (*(nums + Middle) == target) return true; if (*(nums + Left) < *(nums + Middle)) { if (*(nums + Left) <= target && target < *(nums + Middle)) Right = Middle - 1; else Left = Middle + 1; continue; } else if (*(nums + Left) > *(nums + Middle)) { if (*(nums + Middle) < target && target <= *(nums + Right)) Left = Middle + 1; else Right = Middle - 1; continue; } else {//*(nums + Left) == *(nums + Middle)則跳過當前位置上的重複 Left++; } } return false; }