做斗图的网站,wordpress app怎么登录注册,做网站为什么先交定金,seo网站制作33. 搜索旋转排序数组-二分查找
整数数组 nums 按升序排列#xff0c;数组中的值 互不相同 。
在传递给函数之前#xff0c;nums 在预先未知的某个下标 k#xff08;0 k nums.length#xff09;上进行了 旋转#xff0c;使数组变为 [nums[k], nums[k1], …, n…33. 搜索旋转排序数组-二分查找
整数数组 nums 按升序排列数组中的值 互不相同 。
在传递给函数之前nums 在预先未知的某个下标 k0 k nums.length上进行了 旋转使数组变为 [nums[k], nums[k1], …, 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
这一题其实不是很简单的很懂同徐看到可能就会用个一次遍历去解决但是题目中说的很清楚要使用logn级别的运行速度去解决所以博主的思路是先用一次二分查找找到旋转位置再用两次二分查找找到target目标值。 解题代码如下
int findmin(int* nums, int numsSize){int low0,highnumsSize-1,mid(highlow)/2;while(lowhigh){if(nums[mid]nums[low]){lowmid;}if(nums[mid]nums[high]){highmid;}mid(highlow)/2;if(lowhigh-1){break;}}return high;
}
int find_b(int *a,int low,int high,int target){int mid(lowhigh)/2;while(lowhigh){if(a[mid]target){return mid;}if(a[mid]target){lowmid1;}else{highmid-1;}mid(lowhigh)/2;}return -1;
}int search(int* nums, int numsSize, int target){int indexfindmin( nums, numsSize);// printf(index %d ,index);int find1find_b(nums,0,index-1, target);int find2find_b(nums,index, numsSize-1,target);if(find1!-1){return find1;}if(find2!-1){return find2;}return -1;}