【剑指Offer1】 在排序数组中查找数字

题目:

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

 

首先想到最普通的做法,遍历数组同时计数

代码如下:

class Solution {
    public int search(int[] nums, int target) {
        int count = 0;
        for (int index = 0; index < nums.length; index++) {
            if (nums[index] == target) {
                count++;
            }
        }
        return count;
    }
}

 

思考:

最明显的一点,这个做法不排序也没关系,没有利用好排序数组这个特点。因为已经排序,所以正向和逆向同时查询,查到结果之后下标相减再+1,就是target元素重复的次数

代码如下:

class Solution {
    public int search(int[] nums, int target) {
        int beg = -1;
        int end = -1;
        // 首次出现的的下标
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                beg = i;
                break;
            }
        }
        // 最后出现的下标
        for (int j = nums.length - 1; j >= 0; j--) {
            if (nums[j] == target) {
                end = j;
                break;
            }
        }
        if (beg != -1 && end != -1) {
            return end - beg + 1;
        } else {
            return 0;
        }
    }
}

这边有一些小坑需要注意:

1. 逆向查询的结束应该是到j=0为止,否则当tar只出现数组第一位时会有问题
2. 当beg和end都没有被赋值,说明tar在数组中并不存在,不适用end-beg+1的算式(因为结果应该是0)

再优化:是否可以做到真的同时向中间遍历?跳出条件为beg与end相等或者beg与end同时命中,可以进一步减少查询的时间?

posted @ 2022-01-10 10:36  ProbablyTrue  阅读(24)  评论(0编辑  收藏  举报