阿里巴巴网站维护要怎么做,青岛大学春季高考有网站建设吗,巩义在线,网站的出站连接数给定一个n个元素有序#xff08;升序#xff09;的整型数组nums和一个目标值target#xff0c;写一个函数搜索nums中的target#xff0c;如果目标值存在返回下标#xff0c;否则返回-1. //这个题说实话从逻辑上来看实在是太简单了#xff0c;但是为什么每一次我写起来都感… 给定一个n个元素有序升序的整型数组nums和一个目标值target写一个函数搜索nums中的target如果目标值存在返回下标否则返回-1. //这个题说实话从逻辑上来看实在是太简单了但是为什么每一次我写起来都感觉隐隐约约有点问题为什么呢就是因为我的问题没有得到解决我只是一味的去逃避要真正的系统性的提高就不能只知道正确答案是怎么写的还要知道错误答案是怎么错的。
//现在来理清自己的思路首先二分查找是需要三个指针的对应着leftmidright然后对于这个有序的数组我们要做的就是让mid指的数和target比较然后如果target大就修改lefttarget小就修改right相等就返回mid。我的问题是什么呢什么时候返回-1这个问题是要解决的。
//理清了思路之后现在就是把逻辑转化为代码了
public static int search(int nums[],int target)
{int left0,rightnum.length()-1;while(leftright){mid(leftright)/2;//这里为了防止溢出还有优化的可能if(targetnums[mid]){leftmid;}else if{targetnums[mid]right mid;}else{return mid;}}return -1;
}
上面是我自认为正确的代码其实我这个代码是有很多局限的甚至上在思路上都是错的因为从出发点上就错了。作为一个小白最需要做的就是无条件相信教材上的思路现在我只需要背诵记忆等到有一定基础就可以提出自己的想法了这才是学习的路径。把代码随想录的思想全部背下来我所有的操作都要和他一模一样。
代码随想录的逻辑记忆背诵 二分法易错点 while中left是小于还是小于等于right if中nums[mid]target时这个right是等于mid还是mid-1 循环不变量 要明确二分法的区间是左闭右闭还是左闭右开这个是很重要的忽略了这个那么所有的东西都会出问题很少有人定义左开右闭因此忽略现在不理解没关系之后慢慢会理解 左闭右闭 left 0;rightnums.length()-1;
while(leftright)
{//在左闭右闭里面left和right相等是合法区间因此要在while里面进行循环查找
mid(leftright)/2;
if(nums[mid]target){rightmid-1;//因为在左闭右闭的区间里已经明确了mid所指的不是target因为right就没有必要等于mid而是取mid-1
}else if(nums[mid]target){leftmid1;
}else{return mid;
}
}
return -1
上述代码并不规范类似伪代码 左闭右开 int left 0,rightnums.length()-1;
int mid;
while(leftright)
{mid(leftright)/2;//这一步可以优化if(nums[mid]target){rightmid;}else if(nums[mid]target){leftmid1;}else{return mid;}return -1;
}
//这一份代码就比较完美已经彻底理解了二分法我起码在今天写出这一份代码的时候是彻底理解了二分法所有的条件我都明白了未来看到这里希望我还是能够像今天一样彻底理解