剑指 Offer 03. 数组中重复的数字
- 题目描述:
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
- 2 <= n <= 100000
- 解题思路:
遍历数组,用哈希表存储出现过的数字:
func findRepeatNumber(nums []int) int { var res int existed := make(map[int]struct{}, len(nums)) // Go语言空结构体不占空间;容量是确定的,可以在初始化时分配内存,节约时间 for _, i := range nums { if _, ok := existed[i]; ok { res = i break } else { existed[i] = struct{}{} } } return res }
- 题目描述:
统计一个数字在排序数组中出现的次数。
示例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
- 解题思路:
同上题,使用哈希表保存数字出现次数:
func search(nums []int, target int) int { existed := make(map[int]int, len(nums)) for _, i := range nums { existed[i]++ } if res, ok := existed[target]; ok { return res } return 0 }
- 题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例1:
输入: [0,1,3] 输出: 2
示例2:
输入: [0,1,2,3,4,5,6,7,9] 输出: 8
限制:
- 1 <= 数组长度 <= 10000
- 解题思路:
【LeetCode刷题计划-Day 4(查找算法(简单))】输入是有序的,可以采用二分法查找第一个值不等于索引的元素:
func missingNumber(nums []int) int { return binarySearchMissing(nums, 0, len(nums)-1) }func binarySearchMissing(nums []int, left, right int) int { if left > right { return left } mid := left + (right-left)/2 if nums[mid] == mid { return binarySearchMissing(nums, mid+1, right) } else { return binarySearchMissing(nums, left, mid-1) } }
推荐阅读
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- Python|Python 每日一练 二分查找 搜索旋转排序数组 详解
- 【LeetCode】28.实现strstr() (KMP超详细讲解,sunday解法等五种方法,java实现)
- LeetCode-35-搜索插入位置-C语言
- leetcode python28.实现strStr()35. 搜索插入位置
- Leetcode Permutation I & II
- python|leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
- LeetCode 28 Implement strStr() (C,C++,Java,Python)
- Python|Python Leetcode(665.非递减数列)