题目描述
题解
为了设计一个复杂度为 mid
位于哪一个有序数组中。这里提供一个简单的思路,我们将nums[mid]
与nums[0]
作比较,由于数组中的元素互不相等,因此:
1.nums[mid] > nums[0]:那么左半部分[left, mid-1]有序
2.nums[mid] < nums[0]:那么右半部分[mid+1, right]有序
如果target==nums[mid]
,查找成功,退出。
在上述条件1的情况下,如果:target
的值介于[nums[0], nums[mid])
之间,则往左半部分遍历,否则往右半部分遍历。
在上述条件2的情况下,如果:target
的值介于(nums[mid], nums[n-1]]
之间,则往右半部分遍历,否则往左半部分遍历。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target)
{
int n = (int)nums.size();
if (!n) return -1;
if (n == 1) return nums[0] == target ? 0 : -1;
int l = 0, r = n - 1;
while (l <= r)
{
int mid = (l + r) / 2;
if (nums[mid] == target) return mid;
//[0, mid-1]有序
if (nums[0] <= nums[mid])
{
if (nums[0] <= target && target < nums[mid])
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
//[mid+1, n-1]有序
else
{
if (nums[mid] < target && target <= nums[n - 1])
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
}
return -1;
}
};
该题的思想在于:每次二分时,将一个较大的部分有序的数组转化为一个较小的有序数组和一个较小的部分有序数组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix