力扣 - 剑指 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. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...
随机推荐
- ubantu与CentOS虚拟机之间搭建GRE隧道
Author : Email : vip_13031075266@163.com Date : 2020.01.23 Copyright : 未经同意不得 ...
- php-fpm进程数控制
一.名词解释 CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议.负责处理URL的请求,启动一个进程,将客户端发送的数据作为输入,有Web ...
- DLL延时加载技术与资源释放
DLL延时加载技术与资源释放 0x00 前言 诸如调用非Windows的第三方库,我们或许会使用到dll文件,而这个时候原本程序运行需要相应的dll文件才能加载启动.通过DLL延时加载技术,使用延时加 ...
- crontab 语法和最快速的学习
1.Cron 时间表语法 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 ( ...
- [源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator
[源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator 目录 [源码解析] 深度学习分布式训练框架 horovod (20) --- ...
- ESP8266- 使用AT指令获取网络时间
前言:很早就考虑过用 ESP8266 获取网络时间,以前都是用 ESP8266 刷机智云的 Gagent 固件,但无奈现在手头的 ESP-01 的 Flash 只有 1M,实在无法胜任.经过在网络上的 ...
- symfony中使用__construct获取services对象
symfony中服务的使用总所周知的方便,但是当一个controller多次使用到同一个服务的时候就会出现在每个Action中都get获取服务,此时为了省事相信你也尝试使用构造函数申明一个私有对象避免 ...
- obs软件mac设置
1 远程电脑软件teamview或者向日葵 远程mac电脑会时黑屏或连不上, 需要设置系统偏好->设置软件权限 2 设置obs 显示不出画面或声音,也需要在系统偏好设置obs的权限(首先打开OB ...
- Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件
前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...
- Jmeter系列(3) - 静默压测
前言 Windows环境 简述 静默 : 脱离UI运⾏JMeter压测,用命令行方式运行性能测试脚本好处:命令运⾏更容易"搞事情"命令格式: jmeter –n –t $jmx_f ...