1.题目
1.1中文
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
1.2英文
Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.
Example 1:
Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4
Example 2:
Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
2.算法思想
在升序数组nums 中寻找目标值 target
1.在js中有nums.indexOf(target)
,可以直接找到目标值对应的下标,没有就会返回-1
2.二分查找算法的原理如下:
待查序列:nums;目标值: target
- 如果nums为空,那么就返回-1,并退出;这表示查找不到target。
- 如果nums不为空,则将它的中间元素与要查找的目标元素进行匹配,看它们是否相等。
- 如果相等,则返回该中间元素的索引,返回并退出;此时就查找成功了。
- 如果不相等,就再比较这两个元素的大小。
- 如果该中间元素
大于
目标元素,[low,height] = [low,mid-1]
- 如果该中间元素
小于
目标元素,[low,height] = [mid+1,height]
- 在新的待查序列上重新开始第1步的工作。
二分查找之所以快速,是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩得很快,而不像顺序查找那样,每次仅能排除一个元素。
3.代码运行
3.1 javascript
//这里没用算法
var search = function(nums, target) {
return nums.indexOf(target)
};
var search = function(nums, target) {
let low=0 ,height=nums.length-1
while (low<=height){
let mid= Math.floor((height-low)/2)+low
if(nums[mid]==target){
return mid
}else if(nums[mid]>target){
height=mid-1
}else{
low=mid+1
}
}
return -1
};
3.2 Python3
class Solution:
def search(self, nums: List[int], target: int) -> int:
low,height=0,len(nums)-1
while low<=height:
mid=(height-low)//2+low
if nums[mid]==target:
return mid
elif nums[mid]>target:
height=mid-1
else:
low=mid+1
return -1
4 小拓展
4.1 js中的整除运算
Math.ceil(4/3); //向上整除 4/3=2;
Math.floor(4/3); //向下整除 4/3=1;
Math.round(5/2);//四舍五入 parseInt(5/2);//丢弃小数部分,保留整数部分
4.2 python3中的整除运算
(height-low)//2