在排序数组中查找数字

186 阅读1分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

题目

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

示例 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

题目分析

这道题看起来比较简单,主要涉及的数组的二分查找的操作。因为是数组是有序的,我们只需要找到等于target的左边界和右边界,然后右边界减去左边界再加一就是出现的次数的值了。

代码实现

class Solution {
    public int search(int[] nums, int target) {
        int i=0,j=nums.length-1;
        while (i<=j) {
            int m= (i+j)/2;
            if (nums[m]<=target) {
                i=m+1;
            }else {
                j=m-1;
            }
        }
        int right=i;
        if (j>=0 && nums[j] != target) {
            return 0;
        }
        i=0;j=nums.length-1;
        while (i<=j) {
            int m = (i+j)/2;
            if (nums[m]<target) {
                i=m+1;
            }else {
                j=m-1;
            }
        }
        int left =j;
        return right-left-1;
    }
}

这里用到了两次遍历,第一次遍历取出右边界的位置,第二次遍历取出左边界的位置,然后两个位置相减再加一就是个数了,如果第一次遍历的时候就没有找到右边界,说明这个数组中不存在这个数,我们直接返回0就可以了。

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二分查找的操作。

二分查找是查找中最快的算法,二分查找又叫折半查找,使用二分查找必须是顺序结构的线性表。思想就是使用中间位置与想要的值比较,如果中间位置大于查找关键字,就查找前一个子表,否则后一个子表的,直到找到相等的。

如果有不当之处,欢迎指正。