【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)
序数组中查找元素的起始位置):思路分享
《剑指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
复杂度分析:
- 时间复杂度为O(logn),因为是用到二分思想
- 空间复杂度为O(1),并没有使用额外空间
- 原文章:https://blog.csdn.net/weixin_43191250/article/details/112139539
【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)的更多相关文章
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- 【Java】 剑指offer(57-1) 和为s的两个数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它 ...
- 【Java】 剑指offer(12) 机器人的运动范围
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...
- 剑指Offer-42.和为S的两个数字(C++/Java)
题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...
- 剑指Offer 和为S的两个数字
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...
- 剑指Offer——和为S的两个数字
题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入描述: 对应每个测试案例,输出两个数,小的先输出. ...
- 剑指offer--37.和为S的两个数字
链接:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b来源:牛客网@华科渣硕 不要被题目误导了!证明 ...
- 剑指:和为S的两个数字
题目描述 输入一个数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s. 如果有多对数字的和等于s,输出任意一对即可. 你可以认为每组输入中都至少含有一组满足条件的输出. 样例 输入:[1, ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
随机推荐
- Linux配置NTP时间服务器(date、hwclock、NTP服务器的配置)
目录 date命令 hwclock命令 NTP服务的部署 服务端 客户端 date命令 date 命令的作用是查看和设置Linux中的系统日期时间 date ...
- layui在toolbar使用上传控件在reload后失效的问题解决
问题描述 使用layui中的upload组件来上传文件,将按钮放了表格中的toolbar(头部工具栏中),碰到的问题是:第一次可以实现上传文件,但是第二次再上传文件的时候,点击按钮无效. 解决办法 ...
- vue中v-if与v-show的区别以及使用场景
区别 1.手段:v-if是通过控制dom节点的存在与否来控制元素的显隐:v-show是通过设置DOM元素的display样式,block为显示,none为隐藏: 2.编译过程:v-if切换有一个局部编 ...
- mac打开class文件
本来不想写这个东西的.但是这个却费了我一番周折. 我要先声明一点的是,我从来不讲iOS当成一个单独的系统,而是将这个操作系统归位unix内核的系统. 简单来说,我把它当成linux在用. 但是,mac ...
- Jetpack Compose What and Why, 6个问题
Jetpack Compose What and Why, 6个问题 1.这个技术出现的背景, 初衷, 要达到什么样的目标或是要解决什么样的问题. Jetpack Compose是什么? 它是一个声明 ...
- 阿里云RDS数据库到期实例被清除,别急着哭(阿里没有删库跑路),或许还有一线生机
阿里资源到期未续费,数据保存期限: ECS实例的保存期是15天. Redis实例的保存期是7天. RDS实例的保存期也是7天. 过期当天会收到一条短信: [阿里云]尊敬的用户:您的RDS实例(实例ID ...
- Let's go!
第一次开通博客 心情还是很激动的,而且做出了这么好看的页面虽然都是用的别人的组件,自己不是很知道原理但是也很开心,以后会将自己学习的东西写成笔记发在上面
- static在C/C++中的作用-(转自华山大师兄)
1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件 ...
- CENTOS 7 下配置默认网关
1. ip route 显示和设定路由 1.1 显示路由表 [root@linux-node1 ~]# ip route show default via 192.168.56.2 dev eth0 ...
- Centos6.9以下查看端口占用情况和开启端口命令
Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令: lsof -i tcp:80 列出所有端口 netstat -ntlp 1.开启端口(以80端口为例) ...