剑指 offer 笔记(java)

163 阅读1分钟

剑指 offer 笔记(java)

第一次写,数据结构也是刚学的,写的不好,求放过。

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3  

限制:

2 <= n <= 100000

来源:力扣(LeetCode)

第一步:题目分析

在一个数组中找重复的数字,第一时间想到的绝对是依次那前面的数字和后面的作比较,发现哪个重复了,直接输出就结束了。但显然这是不科学的做法——单个元素要与后面的元素比较(内层循环),每一个元素都要进行一次比较(外层循环)。这样时间复杂度直接来到了 O(n2),这球不合理。

方法一

这时,利用集合中 Set 的特性就能很好的解决这个问题。

Set 的特性就是不保存重复的元素。我们可以把数组通过增强 for 循环加入到 Set 集合中,通过分析 .add() 的返回值就能得出元素是否重复。这种方法中,要开辟一个 Set 区域,且需要一遍加入元素,所以时间、空间复杂度都是O(n)。

class Solution {
    public int findRepeatNumber(int[] nums) {
		Set<Interger> set = new HashSet<>();
        for (int num : nums) if (!set.add(num)) return num;
    	return -1;
    }
}
执行结果:
通过
显示详情
执行用时:
5 ms, 
在所有 Java 提交中击败了48.78%的用户
内存消耗:
48.5 MB, 
在所有 Java 提交中击败了6.22%的用户
方法二

睡觉睡觉,困死啦!!!