力扣33:搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 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

暴力解法:

int search(int* nums, int numsSize, int target) {
    for(int i=0;i<numsSize;i++){
        if(nums[i]==target){
            return i;
        }
    }
    return -1;
}

时间复杂度O(n);空间复杂度O(1)

二分查找解法:

int search(int nums[],int n,int target){
	//处理特殊情况
	if(n==0) return -1;
	if(n==1) return (nums[0]==target)?0:-1;
	
	int left=0,righ=n-1;
	while(left<=righ){
		int mid=(left+righ)/2;
		if(nums[mid]==target){
			return mid;//找到了 
		}
		//判断左表有序还是右表有序,将之间子看着是右表的第一个结点便一目了然
		if(nums[left]<=nums[mid]){//左表有序 
			if(nums[left]<=target&&target<nums[mid]){//target在左表中 
				righ=mid-1; 
			}else{
				left=mid+1;//target在右表中 
			}
		}else{//右表有序 
			if(nums[mid]<target&&target<=nums[righ]){//target在右表中 
				left=mid+1;
			}else{//target在左表中 
				righ=mid-1;
			}
		} 
		 
	} 
	return -1;//没有这个元素 
} 

时间复杂度O(logn);空间复杂度O(1)

相关推荐
pianmian120 分钟前
贪心算法.
算法·贪心算法
m0_694938011 小时前
Leetcode打卡:字符串及其反转中是否存在同一子字符串
linux·服务器·leetcode
chenziang11 小时前
leetcode hot 100 二叉搜索
数据结构·算法·leetcode
single5943 小时前
【c++笔试强训】(第四十五篇)
java·开发语言·数据结构·c++·算法
呆头鹅AI工作室3 小时前
基于特征工程(pca分析)、小波去噪以及数据增强,同时采用基于注意力机制的BiLSTM、随机森林、ARIMA模型进行序列数据预测
人工智能·深度学习·神经网络·算法·随机森林·回归
一勺汤4 小时前
YOLO11改进-注意力-引入自调制特征聚合模块SMFA
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·目标跟踪
每天写点bug4 小时前
【golang】map遍历注意事项
开发语言·算法·golang
程序员JerrySUN5 小时前
BitBake 执行流程深度解析:从理论到实践
linux·开发语言·嵌入式硬件·算法·架构
王老师青少年编程5 小时前
gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
数据结构·c++·算法·gesp·csp·信奥赛
robin_suli6 小时前
动态规划子序列问题系列一>等差序列划分II
算法·动态规划