题目

剑指 Offer 53 - I. 在排序数组中查找数字 I

思路1

  • 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是不够高效
  • 题目说了,是排序数组,一想到排序数组,我们可以想到使用二分法:
    • 找出第一个target所在的位置和最后一个target所在的位置,那么出现的次数就是end - start + 1

代码

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. // 获取第一个和最后一个target所在数组的位置
  4. int start = getFirst(nums, 0, nums.length-1, target);
  5. int end = getLast(nums, 0, nums.length-1, target);
  6. // 只要start和end位置在在数组里面,就说明存在,否则返回0
  7. if (start >= 0 && end >= 0) {
  8. return end - start + 1;
  9. }
  10. return 0;
  11. }
  12. // 找到target所在数组第一次出现位置的下标
  13. public int getFirst(int[] nums, int start, int end, int target) {
  14. if (start > end) {
  15. return -1;
  16. }
  17. int midIndex = start + (end - start) / 2;
  18. int midValue = nums[midIndex];
  19. if (target == midValue) {
  20. // 递归的结束条件
  21. // 当前就是第一个的情况:不是最左边的元素并且和前一个元素不相等、是最左边的元素
  22. if ((midIndex != 0 && target != nums[midIndex - 1]) || midIndex == 0) {
  23. return midIndex;
  24. } else {
  25. end = midIndex - 1;
  26. }
  27. } else if (target > midValue) {
  28. start = midIndex + 1;
  29. } else {
  30. end = midIndex - 1;
  31. }
  32. // 根据新的start和end进行查找,找到后一路返回
  33. return getFirst(nums, start, end, target);
  34. }
  35. // 找到target所在数组最后一次出现位置的下标
  36. public int getLast(int[] nums, int start, int end, int target) {
  37. if (start > end) {
  38. return -1;
  39. }
  40. int midIndex = start + (end - start) / 2;
  41. int midValue = nums[midIndex];
  42. if (target == midValue) {
  43. if ((midIndex != nums.length-1 && target != nums[midIndex+1]) || midIndex == nums.length-1) {
  44. // 找到就返回
  45. return midIndex;
  46. } else {
  47. // 右边还有与target相等的数,那么将start指向 midIndex+1,二分查找右边
  48. start = midIndex + 1;
  49. }
  50. } else if (target > midValue) {
  51. // 如果target大于midValue也是二分查找右边
  52. start = midIndex + 1;
  53. } else {
  54. // 如果小于的话,就二分查找左边
  55. end = midIndex - 1;
  56. }
  57. return getLast(nums, start, end, target);
  58. }
  59. }

复杂度分析

  • 时间复杂度:\(O(logN)\)
  • 空间复杂度:\(O(1)\)

力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I的更多相关文章

  1. [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]

    [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...

  2. 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法

    剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...

  3. 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目描述 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例2: 输入: nums = [5,7,7,8,8, ...

  4. 每日一题 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二分查找 哈希表 难易程度:简单 题目描述: 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7 ...

  5. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

  6. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  7. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...

  8. 《剑指offer》面试题53 - I. 在排序数组中查找数字 I

    问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...

  9. 剑指 offer set 1 二维数组中查找

    总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...

随机推荐

  1. WebService学习总结(六)--CXF 与Spring结合+tomcat发布

    该项目在上文   WebService学习总结(四)--基于CXF的服务端开发  的基础上修改为spring上发布的webservice接口 1.新建web project 工程 2.导入spring ...

  2. [Elasticsearch] ES更新问题踩坑记录

    问题描述 我们有个系统设计的时候针对Hive创建表.删除表, 需要更新ES中的一个状态,标记是否删除,在几乎同时执行两条下面的语句的时候,发现在ES 中出现表即使被创建了还是无法被查询到的情况,针对该 ...

  3. JEECG代码审计之文件上传

    JEECG代码审计之文件上传 0x01 简述 JEECG(J2EE Code Generation)是一款基于代码生成器JEE的智能开发平台.引领新的开发模式(Online Coding->代码 ...

  4. 深入学习Composer原理(一)

    Composer作为PHP的包管理工具,为PHPer们提供了丰富的类库,并且让PHP重焕新生,避免被时代淘汰的悲剧.可以说,Composer和PHP7是现在PHP开发者的标配,如果你还没用过Compo ...

  5. nginx环境下提交表单一直301

    之前网站一直正常的,现在提交表单一直301 原因: 前几天把网站http升为https协议,需要去掉连接 // 前内容 把 <form method ="post" acti ...

  6. Dockers(29)- 网络连通

    网络连通 背景 基于docker0建了两个容器tomcat01和tomcat02,网段位于172.12.0.0/16 我们又新建了一个网络,网段为192.168.0.0/16,基于此网段新建了两个容器 ...

  7. Linux系列(5) - 目录处理命令(2)

    删除空目录: rmdir rmdir [目录名] 删除文件或目录: rm rm  -rf  [文件或目录] 选项 -r            删除目录 -f                   强制 ...

  8. centos7.5 部署 lopendap

    一.LDAP究竟是什么? LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了 ...

  9. Python - Context Manager 上下文管理器

    什么是上下文管理器 官方解释... 上下文管理器是一个对象 它定义了在执行 with 语句时要建立的运行时上下文 上下文管理器处理进入和退出所需的运行时上下文以执行代码块 上下文管理器通常使用 wit ...

  10. 「含源码」关于NXP IMX8 Mini的图形开发指南(GPU)案例分享!

    前言 Graphical Demo框架提供了对平台相关依赖的抽象.Graphical应用的通用封装,如模型加载.纹理加载.着色器编译等,以及其它一些通用的应用逻辑处理的封装,使得使用框架的开发人员(以 ...