zoukankan      html  css  js  c++  java
  • 刷题-力扣-1738. 找出第 K 大的异或坐标值

    1738. 找出第 K 大的异或坐标值

    题目链接

    来源:力扣(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 开始计数)。

    示例 1:

    输入:matrix = [[5,2],[1,6]], k = 1
    输出:7
    解释:坐标 (0,1) 的值是 5 XOR 2 = 7 ,为最大的值。
    

    示例 2:

    输入:matrix = [[5,2],[1,6]], k = 2
    输出:5
    解释:坐标 (0,0) 的值是 5 = 5 ,为第 2 大的值。
    

    示例 3:

    输入:matrix = [[5,2],[1,6]], k = 3
    输出:4
    解释:坐标 (1,0) 的值是 5 XOR 1 = 4 ,为第 3 大的值。
    

    示例 4:

    输入: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

    题目分析

    1. 根据题目描述,定义(i,j)的值是前j列中前i个数字的异或,选取第k大的值
    2. 使用动态规划的思想,假设f(x,y)=f(x-1,y-1)XORf(x-1,y)XORf(x,y-1)XORmatrix[i][j]
    3. 边界条件:
      当x=0,y=0时,f(x,y)=matrix[0][0]
      当x=0时,f(x,y)=f(x,y-1)XORmatrix[x][y]
      当y=0时,f(x,y)=f(x-1,y)XORmatrix[x][y]

    代码

    class Solution {
    public:
        int kthLargestValue(vector<vector<int>>& matrix, int k) {
            int m = matrix.size();
            int n = matrix[0].size();
            vector<vector<int>> dp(m, vector<int>(n, 0));
            vector<int> num;
            dp[0][0] = matrix[0][0];
            num.push_back(dp[0][0]);
            for (int j = 1; j < n; ++j) {
                dp[0][j] = dp[0][j - 1] ^ matrix[0][j];
                num.push_back(dp[0][j]);
            }
            for (int i = 1; i < m; ++i) {
                dp[i][0] = dp[i - 1][0] ^ matrix[i][0];
                num.push_back(dp[i][0]);
            }
            for (int i = 1; i < m; ++i) {
                for (int j = 1; j < n; ++j) {
                    dp[i][j] = dp[i - 1][j - 1] ^ dp[i - 1][j] ^ dp[i][j - 1] ^ matrix[i][j];
                    num.push_back(dp[i][j]);
                }
            }
            sort(num.begin(), num.end(), compare);
            return num[k - 1];
        }
    
    private:
        static bool compare(int a, int b) { return a > b; }
    };
    
  • 相关阅读:
    MySQL中char(36)被认为是GUID导致的BUG及解决方案
    Hadoop相关的考题
    算法题
    对于Java静态内部类的理解
    关于网站数据分析
    static class 静态类(Java)转
    《深入浅出数据分析》读书笔记
    hive利器 自定义UDF+重编译hive
    使用kubectl实现Kubernetes容器与本地的文件双向复制
    Coolite Toolkit学习笔记二:服务器端Alert,Confirm,Prompt
  • 原文地址:https://www.cnblogs.com/HanYG/p/14785209.html
Copyright © 2011-2022 走看看