「这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战」
[剑指 Offer 03. 数组中重复的数字]
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
解题思路:
- 本题查找重复数字,这里使用辅助字典
- 遍历数组,将数组中数据在字典中进行初始化,如果没有设置value值为0
- 每次遇见+1,判断如果value值大于1 则是第一个重复的值,进行返回。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
tmp = {}
for row in range(len(nums)):
tmp.setdefault(nums[row],0)
tmp[nums[row]]+=1
if tmp[nums[row]] >1:
return nums[row]
return -1
执行结果:
[剑指 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
解题思路:
-
本题考察二分法查找
-
特殊情况处理:先判断是否存在nums 和 nums的左右两边界值是否大于或者小于target如果不包含target直接返回0
-
二分法进行处理,对查找到的值进行相加,就是我们想要的数量。
-
有更加简单的方法,python只需要用一行代码就可以搞定,nums.count(target),但是本题考察的并非是使用内置函数,所以我们还是消停用二分法做这个题型吧。
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return 0
min_nums = nums[0]
max_nums = nums[-1]
if target <min_nums or target>max_nums:
return 0
arr = int(len(nums) // 2)
tmp = nums[arr] == target
l_tmp = self.search(nums[:arr], target)
r_tmp = self.search(nums[arr + 1:], target)
return l_tmp + tmp + r_tmp
执行结果: