LeetCode演算法題-Number of Boomerangs(Java實現)

weixin_34041003發表於2019-01-15

這是悅樂書的第231次更新,第244篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第98題(順位題號是447)。給定平面中的n個點都是成對不同的,“迴旋鏢”是點(i,j,k)的元組,使得i和j之間的距離等於i和k之間的距離(元組的順序很重要))。找到迴旋鏢的數量。例如:

輸入:[[0,0],[1,0],[2,0]
輸出:2
說明:兩個迴旋鏢是[[1,0],[0,0],[2,0]]和[[1,0],[2,0],[0,0]]

您可以假設n最多為500,點的座標都在[-10000,10000](含)範圍內。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 解題

題目中迴旋鏢的意思是任意三點,只要滿足兩兩距離相等就是一個迴旋鏢。比如a點,有兩個點b和c到a的距離相等,那麼就有兩種組合,abc和acb都滿足迴旋鏢。如果是三個點到a的距離都相等,就會有六種組合,就像排列組合一樣。

我們只需要將距離相等的點記錄下來,然後帶入排列組合的公式n*(n-1)中,累加求和即可,最後的和就是全部可能的迴旋鏢。使用兩層迴圈,讓每一個點都做一次a點,去計算那些到a點距離相等的點。兩點之間距離公式(x1-x2)2+(y1-y2)2,正常應該是需要開平方的,但是題目中有說範圍,因此直接使用平方和,同時也不必擔心溢位的風險。

public int numberOfBoomerangs(int[][] points) {
    int result = 0;
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i=0; i<points.length; i++) {
        for (int j=0; j<points.length; j++) {
            if (i == j) {
                continue;
            }
            int a = points[i][0]-points[j][0];
            int b = points[i][1]-points[j][1];
            map.put(a*a+b*b, map.getOrDefault(a*a+b*b, 0)+1);
        }
        for (int val : map.values()) {
            result += val*(val-1);
        }
        map.clear();
    }
    return result;
}


03 小結

演算法專題目前已日更超過三個月,演算法題文章98+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

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

相關文章