剑指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 2023-04-20 10:44  我不想一直当菜鸟  阅读(36)  评论(0编辑  收藏  举报