搜索旋转排序数组
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 #include <iostream> 2 #include <unordered_map> 3 #include <vector> 4 #include <algorithm> 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 }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具