在排序数组中查找数字I(剑指offer 53-I)
2023-03-14 22:48:28 时间
一、题目描述
统计一个数字在排序数组中出现的次数。
示例 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)
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的