【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,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
随机推荐
- Access denied for user '电脑用户名'@'localhost'
之前没有碰到这个问题,但是这次从gitee上面拉取代码运行,发现存在bug 错误描述 java.sql.SQLException: Access denied for user '10134'@'lo ...
- Spring Cloud Alibaba(8)---Feign服务调用
Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...
- JavaWeb——MySQL约束
内容索引 1. DQL:查询语句 1. 排序查询 2. 聚合函数 3. 分组查询 4. 分页查询 2. 约束 3. 多表之间的关系 4. 范式 5. 数据库的备份和还原 DQL:查询语句 1. 排序查 ...
- C++ primer plus读书笔记——第11章 使用类
第11章 使用类 1. 运算符重载是一种形式的C++多态. 2. 不要返回指向局部变量或临时对象的引用.函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据. 3. 运算符重载的格式如下: ...
- appium等待元素
1.sleep()方法 Thread.sleep(60000)强制等待60s 2.隐式等待implicitlyWait() driver.manage().timeouts().implicitlyW ...
- 基于pyqt5和openpyxl和Pyinstaller的青年大学习检查未学习人数的脚本
前几天接到团支书的一个需求,因为学校给的名单是青年大学习已学习的名单,然而要知道未学习的名单只能从所有团员中再排查一次,过程相当麻烦.团支书跟我抱怨后,刚好我也学过一些操作办公软件的基础.打包pyth ...
- [Java] 数据分析--统计
二项分布 需求:5个四面体筛子,筛子三面绿色,一面红色,模拟1000000次,统计每次试验红色落地筛子个数的分布 实现:用循环实现5个筛子和1000000次试验,定义函数numRedDown模拟5个筛 ...
- body元素的常用属性
一.bgcolor属性 a.bgcolor 设置文档的背景颜色. b.用法 <body bgcolor="red"> body的常用属性! </body> ...
- Zabbix 监控过程详解
Zabbix 监控过程详解 一.修改密码及中文语言 修改密码 修改中文语言 如果复选框中没有 Chinese(zh_CN) 选项,需要安装中文包 [root@Zabbix-server ~]# yum ...
- java 并发包JUC下的CountDownLatch和CyclicBarrier的理解和区别
推荐这篇帖子,讲得不错~ https://blog.csdn.net/liangyihuai/article/details/83106584