搜索旋转排序数组
33. 搜索旋转排序数组
整数数组nums
按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums
在预先未知的某个下标 k
(0 <= k < nums.length
)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7]
在下标 3
处经旋转后可能变为 [4,5,6,7,0,1,2]
。
给你 旋转后 的数组 nums
和一个整数 target
,如果 nums
中存在这个目标值 target
,则返回它的下标,否则返回 -1
。
示例 1:
输入:nums = [4,5,6,7,0,1,2]
, target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2]
, target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0 输出:-1
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums
中的每个值都 独一无二- 题目数据保证
nums
在预先未知的某个下标上进行了旋转 -10^4 <= target <= 10^4
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 class Solution { 8 public: 9 int search(vector<int> &nums, int target) { 10 int left = 0; 11 int right = nums.size() - 1; 12 for (; left <= right;) { 13 int mid = left + (right - left) / 2; 14 if (nums[mid] == target) { 15 return mid; 16 } else if (nums[left] <= nums[mid]) { 17 // 左侧是有序 18 if (target >= nums[left] && target < nums[mid]) { 19 // 目标值在左侧 20 right = mid - 1; 21 } else { 22 // 目标值在右侧 23 left = mid + 1; 24 } 25 } else { 26 // 右侧是有序 27 if (target > nums[mid] && target <= nums[right]) { 28 // 目标在右侧 29 left = mid + 1; 30 } else { 31 // 目标在左侧 32 right = mid - 1; 33 } 34 } 35 } 36 return -1; 37 } 38 }; 39 40 int main() 41 { 42 Solution *test = new Solution(); 43 vector<int> vec = {266, 267, 268, 269, 271, 278, 282, 292, 293, 298, 44 6, 9, 15, 19, 21, 26, 33, 35, 37, 38, 45 39, 46, 49, 54, 65, 71, 74, 77, 79, 82, 46 83, 88, 92, 93, 94, 97, 104, 108, 114, 115, 47 117, 122, 123, 127, 128, 129, 134, 137, 141, 142, 48 144, 147, 150, 154, 160, 163, 166, 169, 172, 173, 49 177, 180, 183, 184, 188, 198, 203, 208, 210, 214, 50 218, 220, 223, 224, 233, 236, 241, 243, 253, 256, 51 257, 262, 263}; 52 int target = 208; 53 std::cout << test->search(vec, target) << endl; // 67 54 55 vec = {4, 5, 6, 7, 0, 1, 2}; 56 target = 0; 57 std::cout << test->search(vec, target) << endl; // 4 58 59 target = 4; 60 std::cout << test->search(vec, target) << endl; // 0 61 62 target = 2; 63 std::cout << test->search(vec, target) << endl; // 6 64 65 target = 9; 66 std::cout << test->search(vec, target) << endl; // -1 67 68 system("pause"); 69 return 0; 70 }
运行结果: