数组:二分查找
使用二分法来查找数组元素是挺高效的一种算法,但是对于判断条件经常容易出现错误,这里写一下判断条件的制定规则
二分法是不断的把区间变小,最重要的就是区间的制定。
一般有两种区间控制类型:1. 左闭右闭 [left,right] 2. 左闭右开 [left,right)
不管哪种方法,控制middle变量的方法是一样的
middle=left+((right-left)/2) //防止溢出
1、[left,right]
因为左右两边都是闭区间,因此都是有效下标值。right的初始值为nums[].length-1。当left==right时是有效的,即right和left都是同一个值。因此循环条件应置为
left<=right
当nums[middle]>target时,要更改左段的结束区间
right=middle-1
left=middle+1
2、[left,right)
因为这里是左闭右开区间,所以right的取值是取不到的,会将其初始值置为数组大小,可以把循环条件置为
left<right
当nums[middle]>target时,要更改左段的结束区间
right=middle
left=middle+1
Leetcode 704:
给定一个 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
使用左闭右闭:
class Solution {
public int search(int[] nums, int target) {
Arrays.sort(nums);
int n=nums.length;
int right=n-1,left=0;
int middle=0;
//左闭右闭
while(left<=right){
middle=left+((right-left)/2);
if(nums[middle]<target){
left=middle+1;
}else if(nums[middle]>target){
right=middle-1;
}else if(nums[middle]==target){
return middle;
}
}
return -1;
}
}
使用左闭右开
class Solution {
public int search(int[] nums, int target) {
Arrays.sort(nums);
int n=nums.length;
int right=n,left=0;
int middle=0;
//左闭右开
while(left<right){
middle=left+((right-left)/2);
if(nums[middle]<target){
left=middle+1;
}else if(nums[middle]>target){
right=middle;
}else if(nums[middle]==target){
return middle;
}
}
return -1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律