随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

剑指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
  • -10<= 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 }
复制代码

方法二:两次二分

  1. 先找目标值第一次出现的位置 FirstTarget,如果第一次出现的位置为-1,代表数组中根本没有目标值,直接返回0即可;
  2. 如果 FirstTarget != -1,则查找目标值最后一次出现的位置LastTarget;
  3. 最后 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)-在排序数组中查找元素的第一个和最后一个位置(中等)差不多,只是返回的形式不一样。

posted on   我不想一直当菜鸟  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2022-04-20 力扣54(java)-螺旋矩阵(中等)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示