二分查找
一开始这么写是不行的
var search = function(nums, target) {
if(nums.indexOf(target)<0){
for(let i=0;i<nums.length;i++){
if(nums[i]===target)return i
}
}
return -1
};
对于测试的数组nums=[-1,0,3,5,9,12]
,nums[0]
是不管用的,但是后面的元素都可以正确匹配
错在判断条件nums.indexOf(target)<0
这儿
为什么呢?
考虑到indexOf
方法是不是自己有哪里没有注意到的细节问题?
官网描述
indexOf()
方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
果然哈,前半句话,找得到匹配元素的话,会返回这个元素的第一个(可能有重复)索引值
那么第一个元素的索引值是0,不会>0,根本就不会进入到判断条件当中去,直接return -1
所以改成这样就可以了nums.indexOf(target)!==-1
var search = function(nums, target) {
if(nums.indexOf(target)!==-1){
for(let i=0;i<nums.length;i++){
if(nums[i]===target)return i
}
}
return -1
};
啊虽然但是,我用的不是二分法(都不知道是个啥,拉垮得一匹
执行用时:72 ms, 在所有 JavaScript 提交中击败了37.88%的用户
内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了45.29%的用户
所以学学二分法
在要查找的数据是有序的前提下,二分法查找会比顺序查找更高效
值得注意的是,二分法也只是对有序的数据集有效
二分法的原理就是
从中间开始找此时分两段,选择其中一段,再从中间开始找并分两半
var search = function(nums, target) {
var upperBound=nums.length-1;
var lowerBound=0;
while(lowerBound<=upperBound){
//之后每一轮循环都会缩小查找的区间,target总在“某一半中”
var mid = Math.floor((upperBound+lowerBound)/2);
if(nums[mid]<target){
lowerBound = mid + 1;
}else if(nums[mid]>target){
upperBound = mid - 1;
}else{
return mid
}
}
return -1
};
执行用时:64 ms, 在所有 JavaScript 提交中击败了73.86%的用户
内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了41.27%的用户
可以,对比看来效率还是提高不少的