package leetCodeNumber;
/**
* @ClassName LeetCode704
* @Description 二分查找
* 题目难度:简单
* 考查知识点:二分查找
* @Author Jiangnan Cui
* @Date 2022/6/5 17:09
* @Version 1.0
*/
public class LeetCode704 {
/**
* 题目描述:
* 给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,
* 如果目标值存在返回下标,否则返回 -1。
* 链接:https://leetcode.cn/problems/binary-search/
*/
/**
* @MethodName search1
* @Description for循环一个一个直接遍历查找
* 时间复杂度:O(n),其中n为数组长度
* 空间复杂度:O(1)
* @param: nums
* @param: target
* @return: int
* @Author Jiangnan Cui
* @Date 2022/6/5 17:12
*/
public static int search1(int[] nums, int target) {
//数组长度
int n = nums.length;
//遍历数组一个一个查找
for (int i = 0; i < n; i++) {
if(nums[i] == target)
return i;
}
return -1;
}
/**
* @MethodName search2
* @Description 由于数组是有序排列的,可以使用二分查找进行遍历
* 时间复杂度:O(logn),其中,n为数组长度
* 空间复杂度:O(1)
* @param: nums
* @param: target
* @return: int
* @Author Jiangnan Cui
* @Date 2022/6/5 17:19
*/
public static int search2(int[] nums, int target){
//定义查找范围的左右边界left、right
int left = 0, right = nums.length - 1;
//当左边界<=右边界时,说明在查找范围内,进行查找
while (left <= right){
//计算中点,注意:为避免整型溢出,此处不使用(left + right) / 2
int mid = (right - left) / 2 + left;
//将中点数组值与目标值进行比较
if(nums[mid] == target){
return mid;//直接查到时,直接返回中点下标
}else if(nums[mid] < target){
left = mid + 1;//小于目标值时,说明要查找的数在中点右侧,所以左边界从中点处向右移动1位
}else{
right = mid - 1;//大于目标值时,说明要查找的数在中点左侧,所以右边界从中点处向左移动1位
}
}
//不满足查找范围时,说明查不到,直接返回-1
return -1;
}
public static void main(String[] args) {
//测试用例1
int[] nums1 = {-1,0,3,5,9,12};
int target1 = 9;
//测试用例2
int[] nums2 = {-1,0,3,5,9,12};
int target2 = 2;
//测试
//方法1
// System.out.println(search1(nums1, target1));
// System.out.println(search1(nums2, target2));
//方法2
System.out.println(search2(nums1, target1));
System.out.println(search2(nums2, target2));
}
}
LeetCode704. 二分查找
于 2022-06-05 17:49:04 首次发布