力扣704(java&python)-二分查找(简单)
题目:
给定一个 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]之间。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
这就是一个标准的二分查找题呀!这是一个有序的数组,设置左右指针并初始化:left = 0, right = nums.length - 1,计算mid =
- nums[mid] <= target : 说明此时mid对应的值可能为结果以及它右边的数可能为结果,即搜索区间就会变为[mid, right],即 left = mid(避免只有两个数的时候,mid = left + (right - left ) / 2向下取整时 mid == left,出现只能在[mid, right]中死循环,不能缩小搜索区间,故mid才变为向上取整 );
- nums[mid] > target:说明在mid右边的数都大于target,因此搜索区间应该变为[left, mid - 1],即 right = mid - 1;
退出循环时left == right, 此时搜索区间缩小为一个点,这时left或者right就可能为答案,就需要对 nums[left] 与 target 进行比较,如果两者相等返回left,不相等说明最终没找到,返回 -1。
java代码:
1 class Solution {
2 public int search(int[] nums, int target) {
3 int left = 0, right = nums.length - 1;
4 while (left < right){
5 int mid = left + (right - left + 1) / 2;
6 if (nums[mid] <= target){
7 //搜索区间为:[mid, right]
8 left = mid;
9 }else{
10 //搜索区间为:[left, mid-1]
11 right = mid - 1;
12 }
13 }
14 return nums[left] == target ? left : -1;
15 }
16 }

python3代码:
1 class Solution:
2 def search(self, nums: List[int], target: int) -> int:
3 left, right = 0, len(nums) - 1
4 while left < right:
5 mid = left + (right - left + 1) // 2
6 if nums[mid] <= target:
7 left = mid
8 else:
9 right = mid - 1
10 return right if nums[right] == target else -1

另一种写法:
java代码:
1 class Solution {
2 public int search(int[] nums, int target) {
3 int left = 0, right = nums.length - 1;
4 while (left <= right){
5 int mid = left + (right - left) / 2;
6 if (nums[mid] < target){
7 //搜索区间为:[mid+1, right]
8 left = mid + 1;
9 }else if (nums[mid] > target){
10 //搜索区间为:[left, mid-1]
11 right = mid - 1;
12 }else{
13 return mid;
14 }
15 }
16 return -1;
17 }
18 }

小知识:
python中的三目运算:

力扣704(java&python)-二分查找(简单)的更多相关文章
- Python二分查找算法
Python 二分查找算法: 什么是二分查找,二分查找的解释: 二分查找又叫折半查找,二分查找应该属于减值技术的应用,所谓减值法,就是将原问题分成若干个子问题后,利用了规模为n的原问题的解与较小规模( ...
- 两种方法实现Python二分查找算法
两种方法实现Python二分查找算法 一. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 arr=[1,3,6,9,10,20,30] def findnumber( ...
- Java实现二分查找算法
Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中 ...
- 【15】-java实现二分查找
二分查找在面试中经常被遇到,这个方法十分优雅 介绍 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.一开始,范围覆盖整个数组 ...
- Java的二分查找
今天学习了二分查找,虽然代码简单,但还是要有必要,记录一下今天的学习的. public class TestBrinarySeach { public static void main(String[ ...
- java 冒泡排序 二分查找 选择排序 插入排序
下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...
- LeetCode 704. Binary Search (二分查找)
题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime: 0 ms, faster than 100 % Memory Usage ...
- 手把手教你用java实现二分查找树及其相关操作
二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...
- java实现二分查找
/** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...
- java 实现二分查找法
/** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * @author Administrator * */ p ...
随机推荐
- 软件推荐: Sourcetree git软件
注意事项: 破解的时候,json文件目录不是软件exe所在目录,是数据目录 %LocalAppData%\Atlassian\SourceTree 还有就是第一次运行弹出个 有个插件要不要用,选第3个 ...
- linux-关于conio.h文件的文件缺失问题
链接: https://pan.baidu.com/s/1Qzo4CkJB1_5E-3rDLtfG4Q 提取码: fh65 编辑以下这个依赖库就可以了 $ cd libconio-1.0.0 $ ./ ...
- IDEA无限试用插件
原文地址 之前一直在找激活方法,忽然想到IDEA不是可以试用吗?一直试用不就可以变相地达到了激活的效果? 本篇作废,本篇作废,本篇作废,由于IDEA插件的问题,导致并不能成功的进行重置试用 新整了个J ...
- 说JS作用域,就不得不说说自执行函数
一个兜兜转转,从"北深"回到三线城市的小码农,热爱生活,热爱技术,在这里和大家分享一个技术人员的点点滴滴.欢迎大家关注我的微信公众号:果冻想 前言 不得不吐槽,学个JS,这个概念也 ...
- .Net Core 使用 TagProvider 与 Enricher 丰富日志
TagProvider [LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱. 您可能不希望因日志记录问 ...
- 记录--开发uniapp nvue App+微信小程序,我踩过的坑( 纯干货 )
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近接了个项目,采用uniapp的nvue开发安卓和ios端+小程序端,第一次开发nvue,对于css布局这块,还是踩了很多坑.以及一些u ...
- 记录--用JS轻松实现一个录音、录像、录屏的工具库
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近项目遇到一个要在网页上录音的需求,在一波搜索后,发现了 react-media-recorder 这个库.今天就跟大家一起研究一 ...
- react-naive工作原理
react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中,virtual dom 就像一个中间层,介于开发者描述的视图与实际在页面上渲染的视图之间.为了在 ...
- 英语文档阅读之Zynq-7000 All Programmable SoC
Read "Zynq-7000 All programmable Soc" 1.Table of Contents 首先是目录,可以看到是标准的总分结构.开头介绍了Zynq的各种功 ...
- 初学 FSMC - 外扩SRAM(三)
1. FSMC相关函数 //FSMC初始化 void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); //FSMC ...