学了一个星期的算法,到周末复习的时候感觉忘得又差不多了,都是记住了一部分细节,但是,不是对每个知识点都了然于心,为了提升学习效果,我决定每周写一次代码随想录的刷题笔记,来帮助巩固学习效果
704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
1
2
3
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
1
2
3
提示:
- 你可以假设 nums 中的所有元素是不重复的。
- n 将在 [1, 10000]之间。
- nums 的每个元素都将在 [-9999, 9999]之间。
思路·
-
二分查找是数组中最基本的一类算法,他的本质是运用截半法,将一个排好序的升序数组通过不断的一分为二来减少查找的次数和时间
-
为了保证二分法的正确执行,我们首先需要一个left指向最左边的元素,还需要一个right = nums.length来指向最右边的元素,最后需要一个mid来帮助我们通过不断的查看中间值的方法来讲数组一分为二。
-
代码的实现如下
class Solution `{ public int search(int[] nums,inttarget) { int left = 0; int right = nums.length-1; int mid = 0; while(left<=right) { mid = (int)(left + (right-left)/2); if(nums[mid]>target) { right = mid-1; } if(nums[mid]<target) { left = mid+1; } if(nums[mid] == target) { return mid; } }`` ` return -1;` } `}`
-
二分查找一定要注意我们的边界问题,为了避免出现这样的问题,我们统一使用
-
left<=right
-
right = mid -1
-
left = mid +1
来确保我们的二分查找不会出现边界错误