[路飞]_每天刷leetcode_02(二分查找)

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

二分查找

今天我们来一起刷一道二分查找题,这道题是一道算法入门题目,我记得在上学的时候听过网易公开课里面的哈佛大学的计算机公开课,第一节课就给学生介绍的这个算法。

二分查找的使用时有限制条件的,必须是在数据已经排好序的基础上才能使用二分查找。

leetcode题目传送门 -> 704. 二分查找

题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

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.

You must write an algorithm with O(log n) runtime complexity.

Example:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
复制代码

解题思路

题目中英文部分已经说的很清楚了我们写的算法时间复杂度必须是 O(log n ). 在这里我们就使用二分查找法来解决这个问题。

关于二分查找,我很熟悉,核心思想点是

  1. 在一个递增/递减的数据中,找某一个内容,先找到中间点 mid
  2. 然后比较mid是不是我们想要的答案,如果是直接返回
  3. 如果不是则看具体mid的值是比target大还是小
  4. 如果mid的值比target大,则target在0~(mid-1)里面,或者不存在数据中
  5. 如果mid的值比target小,则target在(mid + 1) ~ end,或者不存在数据中
  6. 循环1~5步骤,直到找到target或者返回 -1为止。

芜湖~,好的开始写代码

扫描二维码关注公众号,回复: 13169762 查看本文章
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
   const end = nums.length -1;
   const mid = Math.floor(end /2);
   if(nums[mid] === target) return mid;
   if(nums[mid] > target) {
       return search(nums.slice(0, mid -1), target);
   }
   if(nums[mid] < target) {
       return search(nums.slice(mid +1), target);
   }
   return -1;
};
console.log(search([-1,0,3,5,9,12],9)) // 1
复制代码

代码运行结果是 1, 不对呀,明明结果应该是4。 于是我便重新检查了一下代码。这下找到原因了,我把nums截取递归了,那么 index的值肯定是变化了的。所以肯定得到的不是我们想要的结果。 看来不能为了省事就随便写递归,那么我们把递归写成迭代,来试一试。

var search = function (nums, target) {
	let left = 0;
	let right = nums.length - 1;
	while(left <= right) {
		const mid = Math.floor((left + right) /2);
		if(nums[mid] === target) return mid;
		if(nums[mid]> target) {
			right = mid -1;
		}
		if(nums[mid] < target) {
			left = mid +1
		}
	}
  return -1
}

console.log(search([-1,0,3,5,9,12],9)) // 4
复制代码

嗯,这次写的好像没问题了,单个测试用例通过了。继续点击提交,进行多个测试用例检测,全部通过。 虽然今天的问题不难,可是刚开始写的时候还是犯了错误,大家都在提倡TDD 开发流程不是没有道理的呀。 OK,今天的每日一刷就到这里了,我们明天见。

猜你喜欢

转载自juejin.im/post/7030782421230911495