剑指 Offer 53 - I. 在排序数组中查找数字 I

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

剑指 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

注意:本题与主站 34 题相同(仅返回值不同):leetcode-cn.com/problems/fi…

来源:力扣(LeetCode)

链接:leetcode.cn/problems/za…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这部分可以写写:

  1. 这道题考察了什么思想?你的思路是什么?

    看到这种题目,我的思路、第一感觉就是遍历数组,然后看target在数组中出现的次数是多少。

    但是题目的数组是递增的,因此我们可以用二分法来加速查找的过程.

    我们可以考虑将数组作为一个window,window的左边界设为left,右边界设为right。

    我们只需要找到taget窗口的左右边界即可,此时target的数量为right-left-1。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的,二分查找是我们每个程序员必须掌握的啊!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

image.png

     class Solution:
         def search(self, nums: List[int], target: int) -> int:
     ​
             hashmap={}
     ​
             for i in nums:
                 if  i not in hashmap:
                     hashmap[i] = 1
                 else:
                     hashmap[i] += 1
             
             for k,v in hashmap.items():
                 if target == k:
                     return v   
             return 0
     ​
     作者:shen-du-xue-xi-s
     链接:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/solution/ha-xi-biao-qing-xi-ti-jie-by-shen-du-xue-z25x/
     来源:力扣(LeetCode)
     著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、AC 代码:

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

四、总结:

如果你还有更多的思考、分析、总结,通通都加上来吧~

剑指 Offer 53 - I. 在排序数组中查找数字 I

这是一道很经典的查找类型题目,我们遍历数组计数也可以做出来,但是更快的二分查找你能想出来吗?我们遇到这些问题应该寻找最优的方法!

这里是小伞,关注我,给你带来更多优秀内容!