序数组中查找元素的起始位置):思路分享

《剑指offer》题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界

题目解析:

在一个排序数组中,找到target的左右边界,从而得到target的数量

第一感觉:二分查找,因为数组是有序的

灵感闪现!!! 灵感闪现!!! 灵感闪现!!!

给定一个数字target,找到它在排序数组中插入的位置!!!

这道题就是二分插入!你品,你细品!

下面说一下具体思路和步骤:

  • 二分查找的基本形式,边界、判断条件构建
  • 首先找右边界:将二分判断的条件修改为nums[mid]<=target,最后返回i作为右边界
  • 同理找到左边界:二分条件设成nums[mid]<target,返回j作为左边界

优化前代码如下:
*代码实现的是《剑指offer》版本,LeetCode只需将边界装进数组返回即可

class Solution {
public int search(int[] nums, int target) {
//二分边界构建
int i=0,j=nums.length-1;
int mid;
//循环条件
while(i<=j) {
mid=(i+j)>>1;
//舍弃所有小于等于target的值,保证i是第一个右边界
if(nums[mid]<=target) i=mid+1;
else j=mid-1;
}
int right=i;
//判断是否真的存在target
if(j>=0 && nums[j]!=target ) return 0; i=0;
while(i<=j) {
mid=(i+j)>>1;
//舍弃所有大于等于target的值,保证j是左边界
if(nums[mid]<target) i=mid+1;
else j=mid-1;
}
int left=j;
return right-left-1;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

优化后的思想:

  • 第一步找到target在数组中插入的位置
  • 第二步找到(target-1)在数组中插入的位置
  • 两个位置直接相减,就可以得到结果

注意:这里无论寻找的值(target)是否存在,都能够找到合适的索引将其插入数组!也就是开篇的那个想法

优化后的代码如下:

class Solution {
public int search(int[] nums, int target) {
int i=0, j=nums.length-1;
return (helper(nums,target,i,j)-helper(nums,target-1,i,j));
}
private int helper(int[] nums,int target,int i,int j) {
while(i<=j) {
int mid=(i+j)>>1;
if(nums[mid] <= target) i=mid+1;
else j=mid-1;
}
return i;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

复杂度分析:

【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)的更多相关文章

  1. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  2. 【Java】 剑指offer(57-1) 和为s的两个数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它 ...

  3. 【Java】 剑指offer(12) 机器人的运动范围

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...

  4. 剑指Offer-42.和为S的两个数字(C++/Java)

    题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...

  5. 剑指Offer 和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...

  6. 剑指Offer——和为S的两个数字

    题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的.   输入描述: 对应每个测试案例,输出两个数,小的先输出. ...

  7. 剑指offer--37.和为S的两个数字

    链接:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b来源:牛客网@华科渣硕 不要被题目误导了!证明 ...

  8. 剑指:和为S的两个数字

    题目描述 输入一个数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s. 如果有多对数字的和等于s,输出任意一对即可. 你可以认为每组输入中都至少含有一组满足条件的输出. 样例 输入:[1, ...

  9. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

随机推荐

  1. <JVM上篇:内存与垃圾回收篇>04-虚拟机栈

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  2. 鼠标右键添加vscode

    实现效果 右键文件夹,可以使用vscode打开 右键文件,可以使用vscode打开 右键空白处,可以使用vscode打开 进行实现 下载压缩包 为了方便操作,和减少错误,将.reg文件上传到网盘中,点 ...

  3. Scoring System

    ‍Build a scoring system , give the score by referee , and entering the score in system , then take o ...

  4. Xshell6连Linux

    一.安装 文件 链接: 提取码:8rmr 二.连Linux 名称填自己喜欢的.续之前,我们保持一样的名字.主机填IP,根据之前Linux填的静态IP去连接. 然后双击,连接 我们用最高权限,填root ...

  5. 【微信小程序】--小程序中循环遍历(包括js中遍历和wxml中的遍历)

    文章为博主原创,纯属个人见解,如有错误欢迎指出. 如需转载,请注明出处. 在js中遍历 for (var index in res.data.infos) { res.data.infos[index ...

  6. 带你解析MySQL binlog

    前言: 我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到.不清楚你对binlog了解多少呢?本篇文章将从binlog作用.binlog相关参数.解析b ...

  7. 3D教育类小图标_三维立体学习类icon图标素材

    3D教育类小图标_三维立体学习类icon图标素材

  8. Logstash 的命令行入门 ( 附上相关实验步骤 )

    Logstash 的命令行入门 ( 附上相关实验步骤 ) 在之前的博客中,我们已经在 Macbook Big Sur 环境下安装了 ELK 的相关软件,并且已经可以成功运行对应的模块: 如果没有安装的 ...

  9. Arduino杀手在此!!ESP 8266 NodeMCU小白手把手入门(二)(解惑篇)

    上一次更新主要是简单介绍了NodeMCU的基本知识并且进行了一次简单的实操演示,最近有一些读者向我提出了一些小问题,所以决定出一期解惑篇,主要针对的是基础知识不是太牢固,或是喜欢刨根问底的小可爱们.里 ...

  10. ES系列(五):获取单条数据get处理过程实现

    前面讲的都是些比较大的东西,即框架层面的东西.今天咱们来个轻松点的,只讲一个点:如题,get单条记录的es查询实现. 1. get语义说明 get是用于搜索单条es的数据,是根据主键id查询数据方式. ...