剑指offer53(Java)-在排序数组中查找数字(简单)
题目:
统计一个数字在排序数组中出现的次数。
示例 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
注意:本题与力扣 34 题相同(仅返回值不同)
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:暴力求解(面试的时候不推荐)
1 class Solution { 2 public int search(int[] nums, int target) { 3 int res = 0; 4 for (int i = 0; i < nums.length; i++){ 5 if (nums[i] == target){ 6 res++; 7 } 8 } 9 return res; 10 } 11 }
方法二:两次二分
- 先找目标值第一次出现的位置 FirstTarget,如果第一次出现的位置为-1,代表数组中根本没有目标值,直接返回0即可;
- 如果 FirstTarget != -1,则查找目标值最后一次出现的位置LastTarget;
- 最后 LastTarget - FirstTarget + 1 即为出现的次数
注意:我一开始两个二分查找写的代码一样的,但是不可以,要注意区分
参考:三叶姐的题解 和 liweiwei1419的题解
第一次出现的位置里:nums[mid] >= target
最后一次出现的位置里:nums[mid] <= target
1 class Solution { 2 public int search(int[] nums, int target) { 3 int len = nums.length; 4 if (len == 0) return 0; 5 int FirstTarget = FindFirstTarget(nums, target); 6 if (FirstTarget == -1) return 0; 7 int LastTarget = FindLastTarget(nums, target); 8 return LastTarget - FirstTarget + 1; 9 } 10 public int FindFirstTarget(int[] nums, int target){ 11 int left = 0, right = nums.length - 1; 12 while (left < right){ 13 int mid = left + (right - left) / 2; 14 if (nums[mid] >= target){ 15 right = mid; 16 }else { 17 left = mid + 1; 18 } 19 } 20 if (nums[left] == target) return left; 21 return -1; 22 } 23 public int FindLastTarget(int[] nums, int target){ 24 int left = 0, right = nums.length - 1; 25 while (left < right){ 26 int mid = left + (right - left + 1) / 2; 27 if (nums[mid] > target){ 28 //搜索区间为:[left , mid - 1] 29 right = mid - 1; 30 }else { 31 //mid <= target,找的是最后一个目标值 32 //搜索区间为:[mid , right] 33 left = mid; 34 } 35 } 36 return left; 37 } 38 }
与 力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)差不多,只是返回的形式不一样。
分类:
力扣笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-04-20 力扣54(java)-螺旋矩阵(中等)