LeetCode.961-2N數組中N次重複的元素(N-Repeated Element in Size 2N Array)

這是悅樂書的第365次更新,第393篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第227題(順位題號是961)。在大小爲2N的數組A中,存在N+1個唯一元素,並且這些元素中的一個重複N次。

返回重複N次的元素。例如:

輸入:[1,2,3,3]
輸出:3

輸入:[2,1,2,5,3,2]
輸出:2

輸入:[5,1,5,2,5,3,5,4]
輸出:5

注意

  • 4 <= A.length <= 10000

  • 0 <= A [i] <10000

  • A.length是偶數

02 第一種解法

題目的意思是找數組A中出現了N/2次的數,其中N爲數組A的長度。使用HashMapkey爲數組元素,value爲其出現次數,先將A中的元素初始化進HashMap中,然後遍歷HashMap,找到value等於N/2key返回即可。

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;
}


03 第二種解法

同樣是先記數再查找的思路,將第一種解法的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;
}


04 第三種解法

換一種角度來看,把數組中的重複元素找到就行,而去重首選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;
}


05 第四種解法

和第三種解法的思路相同,只是將HashSet換成了int數組。

public int repeatedNTimes4(int[] A) {
    int[] count = new int[10001];
    for (int n : A) {
        if(++count[n] >= 2) {
            return n;
        }
    }
    return -1;
}


06 第五種解法

在第四種解法的基礎上,做進一步簡化,使用字符串代替。新建一個字符串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;
}


07 第六種解法

直接使用兩層循環,匹配相等的元素。

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;
}


08 第七種解法

此解法來自LeetCode給的參答,這個思路很奇妙,算是在第六種解法基礎上的進一步簡化。
同樣使用兩層循環,但是不像第六種解法那樣每次都是比較相鄰的元素,而是分3次跳着比較,第一次是比較相鄰元素,第二次是比較間隔1位的元素,第三次是比較間隔2位的元素,將A切分成4個長度爲一組的子數組,將其中的元素與其距離1、2、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;
}


09 小結

算法專題目前已連續日更超過七個月,算法題文章233+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章