持续创作,加速成长!这是我参与「掘金日新计划 · 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
看到这种题目,我的思路、第一感觉就是遍历数组,然后看target在数组中出现的次数是多少。
但是题目的数组是递增的,因此我们可以用二分法来加速查找的过程.
我们可以考虑将数组作为一个window,window的左边界设为left,右边界设为right。
我们只需要找到taget窗口的左右边界即可,此时target的数量为right-left-1。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的,二分查找是我们每个程序员必须掌握的啊!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
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
这是一道很经典的查找类型题目,我们遍历数组计数也可以做出来,但是更快的二分查找你能想出来吗?我们遇到这些问题应该寻找最优的方法!
这里是小伞,关注我,给你带来更多优秀内容!