个人名片:
作者简介:一名大一在校生
❄️个人主页:小新爱学习.
个人WeChat:hmmwx53
️系列专栏:零基础学java ----- 重识c语言
每日一句:
前言:
最近有许多小伙伴问小新有没有好用的刷题网站,想提升一下自我能力
经过小新缜密的思考与亲身体验,推荐超实用的点击直接访问牛客网
里面用丰富的大厂面试真题、各类算法由易到难层层递进、专项题库应有尽有,还不快来体验体验
请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
数据范围: 0≤len(nums)≤2×10^5
, 数组中任意值满足 ∣val∣≤10^9
进阶:时间复杂度 O(logn) ,空间复杂度 O(1)
输入:
[-1,0,3,4,6,10,13,14],13
返回值:
6
说明:
13 出现在nums中并且下标为 6
输入:
[ ],3
返回值:
-1
说明:
nums为空,返回-1
输入:
[-1,0,3,4,6,10,13,14],2
返回值:
-1
说明:
2 不存在nums中因此返回 -1
本来我们可以遍历数组直接查找,每次检查当前元素是不是要找的值。
for(int i = 0; i < nums.length; i++)
if(nums[i] == target)
return i;
”但是这样这个有序的数组我们就没有完全利用起来。我们想想,若是目标值比较小,肯定在前半区间,若是目标值比较大,肯定在后半区间,怎么评价大小?我们可以用中点值作为一个标杆,将整个数组分为两个区间,目标值与中点值比较就能知道它会在哪个区间,这就是分治的思维。
具体做法:
step 1:从数组首尾开始,每次取中点值。
step 2:如果中间值等于目标即找到了,可返回下标,如果中点值大于目标,说明中点以后的都大于目标,因此目标在中点左半区间,如果中点值小于目标,则相反。
step 3:根据比较进入对应的区间,直到区间左右端相遇,意味着没有找到。
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @param target int整型
* @return int整型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int search(int* nums, int numsLen, int target ) {
if(numsLen<=0)return -1;
int low=0,high=numsLen-1; //初始化双指针
int mid=(low+high)/2;
while(target!=nums[mid]&&low<=high){ //若当前mid值不为查找值,更新查找区域。
if(target>nums[mid]){
low=mid+1;
mid=(low+high)/2;
}
else{
high=mid-1;
mid=(low+high)/2;
}
}
if(low>high)return -1;
else return mid;
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param target int整型
* @return int整型
*/
int search(vector<int>& nums, int target) {
int len = nums.size();
if (len == 0) {
return -1;
}
int left = 0, right = len - 1;
while(left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
// write code here
}
};
想要快速刷题,了解更多欢迎访问 : 牛客网