这是悦乐书的第365次更新,第393篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第227
题(顺位题号是961
)。在大小为2N
的数组A
中,存在N+1
个惟一元素,而且这些元素中的一个重复N
次。es6
返回重复N次的元素。例如:算法
输入:[1,2,3,3]
输出:3数组
输入:[2,1,2,5,3,2]
输出:2数据结构
输入:[5,1,5,2,5,3,5,4]
输出:5es5
注意:code
4 <= A.length <= 10000索引
0 <= A [i] <10000字符串
A.length是偶数
get
题目的意思是找数组A
中出现了N/2
次的数,其中N
为数组A
的长度。使用HashMap
,key
为数组元素,value
为其出现次数,先将A
中的元素初始化进HashMap
中,而后遍历HashMap
,找到value
等于N/2
的key
返回便可。
public int repeatedNTimes(int[] A) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int n : A) { map.put(n, map.getOrDefault(n, 0)+1); } int half = A.length/2; for (Integer key : map.keySet()) { if (map.get(key) == half) { return key; } } return -1; }
一样是先记数再查找的思路,将第一种解法的HashMap
换成int
数组,长度为10001,新数组count的索引为A
中的元素,值为A
中元素的出现次数,而后遍历count
数组,返回其中值等于N/2
的索引,N
为数组A
的长度。
public int repeatedNTimes2(int[] A) { int[] count = new int[10001]; for (int n : A) { count[n]++; } int half = A.length/2; for (int i=0; i<count.length; i++) { if (count[i] == half) { return i; } } return -1; }
换一种角度来看,把数组中的重复元素找到就行,而去重首选HashSet
,遍历A
中的元素,若是HashSet
中已经存在当前元素,即此元素就是要找的屡次出现的元素。
public int repeatedNTimes3(int[] A) { Set<Integer> set = new HashSet<Integer>(); for (int n : A) { if (set.contains(n)) { return n; } else { set.add(n); } } return -1; }
和第三种解法的思路相同,只是将HashSet
换成了int
数组。
public int repeatedNTimes4(int[] A) { int[] count = new int[10001]; for (int n : A) { if(++count[n] >= 2) { return n; } } return -1; }
在第四种解法的基础上,作进一步简化,使用字符串代替。新建一个字符串str,若是当前元素没有出现过在str中,就拼接到str上,反之就是str中已经存在了该元素,返回该元素便可。
public int repeatedNTimes5(int[] A) { String str = ""; for (int n : A) { if (str.indexOf(n+"") < 0) { str += n; } else { return n; } } return -1; }
直接使用两层循环,匹配相等的元素。
public int repeatedNTimes6(int[] A) { int n = A.length; for (int i=0; i<n; i++) { for (int j=i+1; j<n; j++) { if (A[i] == A[j]) { return A[i]; } } } return -1; }
此解法来自LeetCode
给的参答,这个思路很奇妙,算是在第六种解法基础上的进一步简化。
一样使用两层循环,可是不像第六种解法那样每次都是比较相邻的元素,而是分3次跳着比较,第一次是比较相邻元素,第二次是比较间隔1位的元素,第三次是比较间隔2位的元素,将A切分红4个长度为一组的子数组,将其中的元素与其距离一、二、3的元素作比较,至少会存在一个重复元素在其中。
public int repeatedNTimes7(int[] A) { int n = A.length; for (int i=1; i<=3; i++) { for (int j=0; j<n-i; j++) { if (A[j] == A[j+i]) { return A[i]; } } } return -1; }
算法专题目前已连续日更超过七个月,算法题文章233+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!