《算法通关村——透彻理解二分查找》
理解
二分查找,也被称为二分搜索或者折半搜索,是一种在有序数组中查找特定元素的搜索算法。其基本原理是将目标值与数组中间元素进行比较,如果目标值小于中间元素,则在中间元素的左边数组中继续搜索,如果目标值大于中间元素,则在中间元素的右边数组中继续搜索,重复这个过程直到找到目标值或者搜索区域为空。
二分查找的主要优势在于其效率。对于包含n个元素的列表,最坏情况下需要log2(n)步,而简单查找需要n步。这使得二分查找在处理大数据集时更加高效。它是一种“分治”算法,将问题分解为更小的部分,然后分别解决这些部分。
二分查找主要适用于有序的数组或列表,这是因为在无序的数组或列表中,我们无法确定中间元素的位置,因此无法有效地进行二分查找。
总的来说,二分查找是一种高效、简洁的搜索算法,适用于有序的数组或列表。
二分查找的实现
package AlgorithmNineth;
public class HalfSearch {
/**
* 循环版本
* @param nums
* @param target
* @return
*/
public static int HalfSearch1(int[] nums,int target){
int left = 0;
int right = nums.length-1;
while(right>left){
int mid = left + ((right-left)>>1);
if (nums[mid] == target) {
return mid;
}
if(nums[mid] > target){
right = mid - 1;
}
if(nums[mid] < target){
left = mid + 1;
}
}
return -1;
}
/**
* 递归版本
* @param nums
* @param left
* @param right
* @param target
* @return
*/
public static int HalfSearch2(int[] nums, int left, int right , int target){
//递归终止条件
if(left <= right){
int mid = left + ((right - left) >> 1);
if(nums[mid] == target){
return mid;
}else if (nums[mid] > target){
return HalfSearch2(nums,left,mid-1,target);
}else if(nums[mid] < target) {
return HalfSearch2(nums, mid + 1, right, target);
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = new int[]{1,2,3,4,5,6,7,8,9,11};
System.out.println(nums[HalfSearch2(nums,0,nums.length-1,8)]);
System.out.println(nums[7]);
}
}
Leetcode例题
给定一个 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
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
题解
class Solution {
public int search(int[] nums, int target) {
return halfSearch(nums,0,nums.length-1,target);
}
public int halfSearch(int[] nums,int left,int right,int target){
if(left <= right){
int mid = left + ((right - left ) >>1 );
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target) {
return halfSearch(nums,left ,mid-1,target);
}else if(nums[mid] < target){
return halfSearch(nums,mid+1,right,target);
}
}
return -1;
}
}
点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?
也可以加我QQ(2837468248)咨询说明来意!