在排序数组中查找数字I(剑指offer 53-I)

简介: 在排序数组中查找数字I(剑指offer 53-I)

一、题目描述



统计一个数字在排序数组中出现的次数。


示例 1:

输入: nums = [5,7,7,8,8,10], target = 8

输出: 2


示例 2:

输入: nums = [5,7,7,8,8,10], target = 6

输出: 0


提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

nums 是一个非递减数组

-109 <= target <= 109


class Solution {
    public int search(int[] nums, int target) {
    }
}


二、思路讲解



1、方法一

     

暴力查找。


2、方法二


二分查找改进。题目中的数组是已经排好序的,故而可以想到二分查找。

     

并且,在二分查找的基础上仍可以优化:当左边的数字小于target时,不可能找到了,可以直接break;同理,右边的数字大于target时,也可以直接break。


三、算法描述



1、方法一

     

遍历数组nums,若与target相等,则计数加一。


2、方法二


使用二分查找,若与target相等,则计数加一;一旦左边的指针指向的数小于target、右边的指针指向的数大于target时,可以提前结束。

 

四、Java代码实现



1、方法一


class Solution {
    public int search(int[] nums, int target) {
        int count = 0;
    for(int i=0; i<nums.length; i++) {
      if(target == nums[i]) {
        count++;
      }
    }
    return count;
    }
}


2、方法二


 if (nums.length == 0) {
            return 0;
        }
        int sum = 0;
        int mid = nums.length >> 2;
        if (nums[mid] == target) {
            sum++;
        }
        int i = mid, j = mid;
        while (i > 0 || j < nums.length - 1) {
            if (i > 0) {
                if (nums[i] >= target) {
                    i--;
                    if (nums[i] == target) {
                        sum++;
                    }
                } else {
                    i = -1;
                }
            }
            if (j < nums.length - 1) {
                if (nums[j] <= target) {
                    j++;
                    if (nums[j] == target) {
                        sum++;
                    }
                } else {
                    j = nums.length;
                }
            }
        }
        return sum;


五、时空复杂度分析



1、方法一


       时间复杂度:O(n)        遍历数组nums

       空间复杂度:O(1)


2、方法二


       时间复杂度:O(logn)        二分查找的时间复杂度为logn

       空间复杂度:O(1)

相关文章
|
前端开发 应用服务中间件 nginx
nginx中配置不输入端口(指定地址)访问项目的方法
nginx中配置不输入端口(指定地址)访问项目的方法
980 0
|
存储 域名解析 缓存
|
10月前
|
人工智能
我说魔,你说搭-魔搭AI视频宣传片挑战赛
当大家都喊魔塔的时候,我们决定搞个事情...有人管咱们叫"魔塔"?
306 4
|
监控 网络安全 虚拟化
Hyper-V中Win10,虚拟机运行错误处理的方案
当Hyper-V中的Windows 10虚拟机出现运行错误时,可按以下步骤处理:首先进行基本检查与修复,包括检查虚拟机配置、确保Hyper-V服务正常运行及重启相关服务。其次,使用PowerShell命令或DISM工具修复虚拟机配置和系统组件。接着,查看事件查看器中的错误日志,分析问题原因。调整虚拟机资源分配,优化性能。针对特定错误情况,如启动失败或网络问题,采取相应措施解决。若问题仍未解决,考虑克隆、重置或重新安装虚拟机,必要时联系技术支持。操作前请备份重要数据并以管理员身份运行命令。
1141 22
|
安全 Android开发 数据安全/隐私保护
《鸿蒙Next原生应用的独特用户体验之旅》
鸿蒙Next在界面设计、操作逻辑、动效体验等方面与iOS类似,强调简洁一致性,悬浮效果提升空间感。其操作便捷,动效流畅,性能优化使流畅度提升30%,媲美iOS。智能交互方面,鸿蒙Next的小艺助手和跨设备互联功能表现出色,支持识屏对话等深度交互。安全隐私保护机制细致,应用体积小,节省流量和存储空间。相比安卓和iOS,鸿蒙Next在用户体验上展现出独特优势,为用户带来更优质、便捷和安全的使用感受。
899 9
|
机器学习/深度学习 自然语言处理 数据处理
《量子机器学习:构建量子版神经网络模型》
量子计算与机器学习的融合带来了新机遇。量子卷积神经网络利用量子比特的叠加和纠缠特性,高效处理大规模数据,提升特征提取速度与泛化能力。量子循环神经网络则擅长处理复杂序列数据,通过量子比特状态传递信息,增强计算效率。设计量子神经网络需考虑量子比特选择、状态、操作及网络结构,尽管面临外界干扰等挑战,该模型在图像识别、语音识别等领域展现巨大潜力,未来将推动更多创新。
366 7
|
Linux 开发工具 Python
【Linux】定时任务
【Linux】定时任务
147 1
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::array 的用法
C++ JSON库 nlohmann::basic_json::array 的用法
1556 1
|
存储 消息中间件 Kubernetes
多路复用I/O-select
多路复用I/O-select
207 0

热门文章

最新文章