1738. 找出第 K 大的異或座標值

2021-05-19 LeetCode每日一題

鏈接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/

標籤:數組、位運算、二維前綴和

題目

給你一個二維矩陣 matrix 和一個整數 k ,矩陣大小爲 m x n 由非負整數組成。

矩陣中座標 (a, b) 的 值 可由對所有滿足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下標從 0 開始計數)執行異或運算得到。

請你找出 matrix 的所有座標中第 k 大的值(k 的值從 1 開始計數)。

輸入:matrix = [[5,2],[1,6]], k = 1
輸出:7
解釋:座標 (0,1) 的值是 5 XOR 2 = 7 ,爲最大的值。
    
輸入:matrix = [[5,2],[1,6]], k = 2
輸出:5
解釋:座標 (0,0) 的值是 5 = 5 ,爲第 2 大的值。
    
輸入:matrix = [[5,2],[1,6]], k = 3
輸出:4
解釋:座標 (1,0) 的值是 5 XOR 1 = 4 ,爲第 3 大的值。
    
輸入:matrix = [[5,2],[1,6]], k = 4
輸出:0
解釋:座標 (1,1) 的值是 5 XOR 2 XOR 1 XOR 6 = 0 ,爲第 4 大的值。

m == matrix.length
n == matrix[i].length
1 <= m, n <= 1000
0 <= matrix[i][j] <= 106
1 <= k <= m * n

分析

由題意可知,座標(a, b)的值其實就是該點的左上角區域所有數的亦或值。

即圖中綠色區域的部分。定義任何一點(a, b)的值爲values[i][j],那麼對於任何一點(a, b),它的值爲

values[i] [j] = values[i - 1] [j] ^ values[i] [j - 1] ^ values[i - 1] [j - 1] ^ matrix[i - 1] [j - 1]

接下來的如何去實現了,對於每個座標的亦或值,可以利用二維前綴和,用一個二維數組迭代求值,然後把每個值放入一個一維數組,最後對一維數組排序,拿到第K大的值即可。

一開始我的想法是利用一個TreeSet去存儲異或值,因爲TreeSet能幫我們排序,後來發現Set不能存儲重複元素,所以不太好弄,就換成了一維數組。

class Solution {
    public int kthLargestValue(int[][] matrix, int k) {
        int m = matrix.length, n = matrix[0].length, count = 0;
        int[][] values = new int[m + 1][n + 1];
        int[] res = new int[m * n];

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                values[i][j] = (values[i][j - 1] ^ values[i - 1][j] ^ values[i - 1][j - 1] ^ matrix[i - 1][j - 1]);
                res[count++] = values[i][j];
            }
        }

        // 升序數組
        Arrays.sort(res);

        return res[res.length - k];
    }
}

時間複雜度O(m * n),空間複雜度O(m * n)


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