LeetCode刷题系列之数组--0704.二分查找(JAVA版本)
#0704. 二分查找
难度:简单
题目:给定一个 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
解法一: 基础解法
public static int search(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {if (nums[i] == target) {return i;}}return -1;
}
二分查找解法【重点】
二分查找的原理就是设置left与right两个索引,并通过两个索引的中间值middle 分别从最左侧与最右侧向中间查找目标值,通过一步步缩小范围最终找到目标值。
二分查找也可分为两种解法,区别在于左右区间的设置不同。
二分查找解法1:[left,right]
public static int search(int[] nums, int target) {int left = 0 ;int right = nums.length -1 ; //区间右闭合,right索引从最右侧数开始while(left <= right) { // right索引有意义,所以符号为 <=int middle = (left + right) / 2 ;if (nums[middle] > target) {right = middle - 1 ;} else if(nums[middle] < target) {left = middle + 1 ;} else {return middle;}}return -1;
}
注意:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
二分查找解法2:[left,right)
public static int search(int[] nums, int target) {int left = 0 ;int right = nums.length; // 右开区间,right索引从数组外开始while(left < right) { // right无意义,所以符号为 <int middle = (left + right) / 2 ;if (nums[middle] > target) {right = middle; // 时刻记得right为开区间索引值,是不能被取到的} else if(nums[middle] < target) {left = middle + 1 ;} else {return middle;}}return -1;
}
注意:
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
总结:
二分法的两种解法是在数学意义上的不同,要充分理解区间定义不同所带来的代码方面的差异。
最后附上LeetCode本题的链接,完全理解了的小伙伴可以去尝试一下这道题:
https://leetcode-cn.com/problems/binary-search/
LeetCode刷题系列之数组--0704.二分查找(JAVA版本)相关推荐
- LeetCode刷题(十)----数组-----medium部分(Java、C++)
LeetCode刷题(十)-----数组-------medium部分(Java.C++) 238. 除自身以外数组的乘积 给定长度为n的整数数组nums,其中n>1,返回输出数组output, ...
- LeetCode刷题笔记2——数组2
LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...
- LeetCode力扣刷题——居合斩!二分查找
二分查找 一.算法解释 二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取 一部分继续查找,将查找的复杂度大大减少.对于一个长度为 O ( n ) 的数组 ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- Leetcode刷题系列(一)——巧解数学问题
文章目录 1.引言 2.最大公约数与最小公倍数 2.1最大公约数 2.2最小公倍数 3.筛法和打表 4.进制转换 5.角度问题(1rad=180°/π) 6.同余定理 7.容斥原理 8.距离度量公式 ...
- 为了更快的砍柴,每日磨刀:LeetCode刷题总结(数组篇)
看完<资深技术Leader曹乐:如何成为技术大牛>这篇文章后,我把提升代码能力,放到了一个优先级比较高的位置.为什么是刷LeetCode而不是看开源代码?可能有几个方便的原因: 1 面试笔 ...
- C#LeetCode刷题-树状数组
树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 493 翻转 ...
- 【leetcode刷题】 64.数组的度——Java版
⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 看明白了就不难,总结一下就是要找出数组的众数,并且还有找出众数在数组中第一次出现和最后一次出现的位置,两个位置组成区间长度就是答案 ...
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- LeetCode 刷题系列(前缀和题目)之 974. 和可被 K 整除的子数组
题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续.非空) 子数组 的数目. 子数组 是数组的 连续 部分. 示例 1: 输入:nums = [4,5,0,- ...
最新文章
- 辽宁省风力发电行业“十四五”前景规划及竞争策略分析报告2022-2028年版
- 博客构建工具推荐(文本送书)
- css那些事儿2 经典两列布局
- sqlserver存储过程入门之 游标
- sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!
- Linux—系统启动类故障之 GRUB引导故障
- JavaScript 中 substr 和 substring的区别
- java常用api简单统计
- 微软、阿里抢占开源一线,JavaScript、Python 备受热捧,GitHub 2020 数字洞察报告揭晓!...
- 用SandCastle为注释生成chm文档
- 安卓10刷Magisk并安装JustTrustMe
- python量化交易策略实例_Python进阶量化交易:听说有个回测框架叫backtrader
- python tkinter控件treeview的数据列表显示的实现_code
- Python概述:C++程序员眼中的Python
- MIC29302WU-TR高电流、高精度、低压差的稳压器
- 多开技术的出现发挥了什么作用?
- 遭遇服务器故障,这排查思路真的稳
- 读入2个整数A和B,然后输出它们的和
- 丹琦女神出品|开放域问答综述
- 粗读SynFace: Face Recognition with Synthetic Data