leetcode1738

题目大意:

给你一个二维矩阵 matrix 和一个整数 k,矩阵大小为 m x n 由非负整数组成。

矩阵中坐标 (a, b)的 值 可由对所有满足 0 <= i <= a < m0 <= j <= b < n 的元素 matrix[i][j]下标从 0 开始计数)执行异或运算得到。

请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。

来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/


解决思路:

这题的思路是使用动态规划进行优化,再使用选择算法进行求第K大的数。

设定 dp[n][m] = ∑ i = 0 , j = 0 n , m \sum_{i=0, j=0}^{n, m} i=0,j=0n,m^matrix[i][j] ,该dp数组可以在O(nm)复杂度内计算。故所求矩阵也就是dp。将其带入第K大选择算法中即可。

时间复杂度:O(nm) 空间复杂度:O(nm)

class Solution {
public:
    int kthLargestValue(vector<vector<int>>& matrix, int k) {
        int dp[1005][1005];
        memset(dp, 0, sizeof dp);
        int s[1005 * 1005], tot = 0;
        int n = matrix.size(), m = matrix[0].size();
        for (int i = 1; i <= n; i++) {
            int pre = 0;
            for (int j = 1; j <= m; j++) {
                pre ^= matrix[i - 1][j - 1];
                dp[i][j] = pre ^ dp[i - 1][j];
                s[tot++] = dp[i][j];
            }
        }
        return select(s, tot, tot - k + 1);
    }
    int select(int a[], int len, int k) {
        if (len <= 38) {
            sort(a, a + len);
            return a[k - 1];
        }
        int i, j, z, ans;
        int *p = new int[3 * len / 4], *q = new int[3 * len / 4];
        for (i = 0; i < len / 5; i++) {
            p[i] = Mid(a, i);
        }
        int middle = select(p, i, (i + 1) / 2);
        i = j = z = 0;
        for (int t = 0; t < len; t++) {
            if (a[t] < middle)
                p[i++] = a[t];
            else if (a[t] == middle)
                j++;
            else    
                q[z++] = a[t];
        }
        if (i >= k)
            ans = select(p, i, k);
        else if (i + j >= k)
            ans = middle;
        else    
            ans = select(q, z, k - i - j);
        delete[] p, q;
        return ans;
    }
    int Mid(int a[], int i) {
        int k = i * 5;
        if (a[k] > a[k + 2])
            swap(a[k], a[k + 2]);
        if (a[k + 1] > a[k + 3])
            swap(a[k + 1], a[k + 3]);
        if (a[k] > a[k + 1])
            swap(a[k], a[k + 1]);
        if (a[k + 2] > a[k + 3])
            swap(a[k + 2], a[k + 3]);
        if (a[k + 1] > a[k + 2])
            swap(a[k + 1], a[k + 2]);
        if (a[k + 4] > a[k + 2])
            return a[k + 2];
        else if (a[k + 4] > a[k + 1])    
            return a[k + 4];
        else 
            return a[k + 1];
    }
};
您好,对于使用PCIE 转 USB 3.0 控制器 chip upd720201Linux 系统下的驱动,下面是一个简要的回答: upd720201 是一种常见的 PCIE 转 USB 3.0 控制器芯片,一般用于将 PCIE 接口转换为 USB 3.0 接口的转换器或扩展卡上。在使用 Linux 系统时,对于 upd720201驱动,一般来说,Linux 内核已集成了常见的控制器芯片的驱动程序,因此通常无需手动安装额外的驱动。 通常在多数 Linux 发行版中,内核已经支持 upd720201 控制器芯片,并自动加载正确的驱动。因此,当您将 PCIE 转 USB 3.0 转换器或扩展卡插入服务器或台式机的 PCIE 插槽时,Linux 内核会自动识别并加载驱动。运行 lsusb 命令可以查看与该控制器相关的 USB 设备是否正确识别。 但请注意,在某些情况下,可能会出现兼容性问题,导致标准内核驱动无法正常工作。如果您遇到这种情况,您可以尝试以下解决方法: 1. 更新 Linux 内核:某些发行版的内核版本可能较旧,不支持最新的硬件设备。通过更新最新版本的内核,可以增加对 upd720201 的支持,并解决兼容性问题。 2. 安装额外的驱动程序:如果更新内核后问题仍然存在,您可以尝试手动安装 upd720201 的特定驱动程序。您可以在 upd720201 控制器芯片制造商的网站上查找针对 Linux驱动程序,并根据提供的安装指南进行操作。 总结一下,大多数情况下,在 Linux 系统中使用 PCIE 转 USB 3.0 控制器芯片 upd720201 时,不需要手动安装额外驱动程序。但在某些情况下,可能需要更新内核或安装特定的驱动程序来解决兼容性问题。希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值