力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目
思路1
- 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录
target数组出现的次数,但是这样的时间复杂度是O(n),还是不够高效 - 题目说了,是排序数组,一想到排序数组,我们可以想到使用二分法:
- 找出第一个
target所在的位置和最后一个target所在的位置,那么出现的次数就是end - start + 1了
- 找出第一个
代码
class Solution {
public int search(int[] nums, int target) {
// 获取第一个和最后一个target所在数组的位置
int start = getFirst(nums, 0, nums.length-1, target);
int end = getLast(nums, 0, nums.length-1, target);
// 只要start和end位置在在数组里面,就说明存在,否则返回0
if (start >= 0 && end >= 0) {
return end - start + 1;
}
return 0;
}
// 找到target所在数组第一次出现位置的下标
public int getFirst(int[] nums, int start, int end, int target) {
if (start > end) {
return -1;
}
int midIndex = start + (end - start) / 2;
int midValue = nums[midIndex];
if (target == midValue) {
// 递归的结束条件
// 当前就是第一个的情况:不是最左边的元素并且和前一个元素不相等、是最左边的元素
if ((midIndex != 0 && target != nums[midIndex - 1]) || midIndex == 0) {
return midIndex;
} else {
end = midIndex - 1;
}
} else if (target > midValue) {
start = midIndex + 1;
} else {
end = midIndex - 1;
}
// 根据新的start和end进行查找,找到后一路返回
return getFirst(nums, start, end, target);
}
// 找到target所在数组最后一次出现位置的下标
public int getLast(int[] nums, int start, int end, int target) {
if (start > end) {
return -1;
}
int midIndex = start + (end - start) / 2;
int midValue = nums[midIndex];
if (target == midValue) {
if ((midIndex != nums.length-1 && target != nums[midIndex+1]) || midIndex == nums.length-1) {
// 找到就返回
return midIndex;
} else {
// 右边还有与target相等的数,那么将start指向 midIndex+1,二分查找右边
start = midIndex + 1;
}
} else if (target > midValue) {
// 如果target大于midValue也是二分查找右边
start = midIndex + 1;
} else {
// 如果小于的话,就二分查找左边
end = midIndex - 1;
}
return getLast(nums, start, end, target);
}
}
复杂度分析
- 时间复杂度:\(O(logN)\)
- 空间复杂度:\(O(1)\)
力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I的更多相关文章
- [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]
[简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...
- 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法
剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目描述 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例2: 输入: nums = [5,7,7,8,8, ...
- 每日一题 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二分查找 哈希表 难易程度:简单 题目描述: 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7 ...
- 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...
- [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)
##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
- 《剑指offer》面试题53 - I. 在排序数组中查找数字 I
问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...
- 剑指 offer set 1 二维数组中查找
总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...
随机推荐
- 使用Keepalived实现Nginx的自动重启及双主热备高可用
1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...
- MySQL——获取元数据
---------------------------------------------------------------------------------------------------- ...
- 针对Autocad 2014 第二次安装不上的问题
针对Autocad 2014 第二次安装不上的问题 1. 以下为卸载过程,不用管. 2. 卸载完之后,右击"开始",点击"运行",得到下图: 并输入:&qu ...
- NLP与深度学习(四)Transformer模型
1. Transformer模型 在Attention机制被提出后的第3年,2017年又有一篇影响力巨大的论文由Google提出,它就是著名的Attention Is All You Need[1]. ...
- 源码编译安装 LNMP及论坛
一.安装Nginx服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 yum -y install ...
- Spring5框架学习笔记
Spring5学习笔记 介绍: 1.引入相应jar包 导入: ps:网上下载教程: https://repo.spring.io/release/org/springframework/spring/ ...
- zip命令常用选项
大家都知道,在linux上一切皆文件,在实际生产环境中,如果我们需要部署一些系统的服务,我们会将一些软件包提前下载下来统一放到一个文件夹中, 然后将部署的过程用shell或者python写成一个脚本, ...
- 干货!基于SpringBoot的RabbitMQ多种模式队列实战
目录 环境准备 安装RabbitMQ 依赖 连接配置 五种队列模式实现 1 点对点的队列 2 工作队列模式Work Queue 3 路由模式Routing 4 发布/订阅模式Publish/Subsc ...
- 消息队列之 kafka 集群搭建
我们先弄清楚kafka集群环境首先需要些什么 JDK 10+ Zookeeper Kafka 2.x 首先准备三台虚拟机 centos7 ,更改IP地址为静态地址分别为,29.30.31 cd /et ...
- 入坑微信小程序必经之路(六)图片上传服务器——WebSercice接口
wxml文件 <view class="weui-uploader"> <view class="img-v weui-uploader__bd&quo ...