Leetcode-每日一题【剑指 Offer 53 - I. 在排序数组中查找数字 I】

题目

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

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

解题思路

1.题目要求我们统计一个数字在排序数组中出现的次数。看到题的第一眼我们肯定会想去用while循环一个一个的去比较,但是这种暴力的解法会超出时间限制,所以我们可以换一种思路,那就是采用二分法去求解。

2.首先,我们初始化两个变量`left`和`right`,分别表示数组`nums`的起始索引和结束索引。同时,初始化一个变量`count`,用于记录目标值`target`的出现次数。

3. 采用while循环,结束条件是`left < right`,即`left`小于`right`。这个循环用于找到目标值`target`在数组中的起始位置。 在循环体内,首先计算中间位置`mid`,通过`(left+right)/2`得到。接下来,通过判断`nums[mid]`与`target`的大小关系,来更新`left`和`right`的值。如果`nums[mid]`大于等于`target`,则将`right`更新为`mid`,表示目标值`target`可能在左侧或者当前位置。如果`nums[mid]`小于`target`,则将`left`更新为`mid+1`,表示目标值`target`在右侧。 当循环结束后,`left`的值即为目标值`target`在数组中的起始位置。

4. 接下来,进入一个新的while循环,条件是`left < nums.length`,即`left`小于数组`nums`的长度。这个循环用于计算目标值`target`在数组中的出现次数。 在循环体内,首先判断`nums[left]`与`target`是否相等。如果相等,则将`count`的值加1。然后,将`left`的值加1,继续下一次循环。

5. 最后,返回`count`的值,即目标值`target`在数组`nums`中的出现次数。

代码实现

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int count = 0;
        while(left < right){
            int mid = (left + right) / 2;
            if(nums[mid] >= target){
                right = mid;
            }
            if(nums[mid] < target){
                left = mid + 1;
            }
        }
        while(left

测试结果

Leetcode-每日一题【剑指 Offer 53 - I. 在排序数组中查找数字 I】_第1张图片

Leetcode-每日一题【剑指 Offer 53 - I. 在排序数组中查找数字 I】_第2张图片 

 

你可能感兴趣的:(算法每日一题,leetcode,算法,职场和发展,数据结构,java)