题目:

给定一个 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 =

= left + (right - left + 1) / 2 (向上取整),循环条件是:left < right:
  • 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)-二分查找(简单)的更多相关文章

  1. Python二分查找算法

    Python 二分查找算法: 什么是二分查找,二分查找的解释: 二分查找又叫折半查找,二分查找应该属于减值技术的应用,所谓减值法,就是将原问题分成若干个子问题后,利用了规模为n的原问题的解与较小规模( ...

  2. 两种方法实现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( ...

  3. Java实现二分查找算法

    Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中 ...

  4. 【15】-java实现二分查找

    二分查找在面试中经常被遇到,这个方法十分优雅 介绍 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.一开始,范围覆盖整个数组 ...

  5. Java的二分查找

    今天学习了二分查找,虽然代码简单,但还是要有必要,记录一下今天的学习的. public class TestBrinarySeach { public static void main(String[ ...

  6. java 冒泡排序 二分查找 选择排序 插入排序

    下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...

  7. LeetCode 704. Binary Search (二分查找)

    题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime:  0 ms, faster than 100 % Memory Usage ...

  8. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  9. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  10. java 实现二分查找法

    /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * @author Administrator * */ p ...

随机推荐

  1. manjaro系统的xfce桌面环境的的壁纸存放位置

    /usr/share/backgrounds/xfce 添加新照片的命令是: sudo mv 目录/* /usr/share/backgrounds/xfce  

  2. using用法总结

    一.命名空间的使用 不再赘述. 二.在子类中改变基类成员的访问权限 using可以将public和protected的基类成员的访问权限改为public.protected.private,注意,us ...

  3. Serverless学习笔记

    Serverless 闲言碎语 前段时间看了一些Serverless的文章,恰好最近又听了一门Serverless的应用实践课程,就把笔记拿出来和大家分享一下,如表述有误还请各位斧正 大家关心的问题 ...

  4. KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障

    ​ KingbaseES V8R6备份恢复案例之---system-Id不匹配备份故障 案例说明: 在KingbaseES V8R6执行备份时,在sys_log日志中出现system-id不一致的故障 ...

  5. Amazon免费CE2基于docker部署nginx,并实现访问

    在部署之前,请确保你已经申请好了CE2免费的服务器,网上的相关教程很多,可以自由参考. 一.使用xshell+公钥连接实例 1.打开xshell,导入密钥, 选择"工具" -> ...

  6. 24年3月使用VS22编译Telegram Desktop

    0.环境准备,我使用的VS版本是17.9.4,SDK版本是10.0.22621.0,最好不要用太老的版本 1.去下载Python,git,cmake这三个工具,然后在D盘根目录新建TBuild文件夹, ...

  7. SQL日期操作函数(CONCAT、DATE_FORMAT、LAST_DAY)

    获取某月底日期:SELECT LAST_DAY('2021-07-01') AS month_end_date; 拼接年月格式: CONCAT(DATE_FORMAT(hp.planned_payme ...

  8. 整合mybatis-spring需要的maven依赖配置

    创建maven项目,导入相关jar包 junit 1 <dependency> 2 <groupId>junit</groupId> 3 <artifactI ...

  9. python 1992和2006年国家标准学科分类和代码标准化并存入MySQL数据库

    数据表 代码 1 import pandas as pd 2 import pymysql 3 4 5 def get_subject_1992(): 6 res={} 7 the_former_co ...

  10. 报名启动|OpenHarmony源码转换器—多线程特性转换赛题