這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!