373. 查找和最小的 K 对数字

题目描述:373. 查找和最小的 K 对数字

题解

直观的思路是每一个结点都向右侧和下侧扩展,但是这种方案会引起重复。

修正后的方案是将第一列结点添加入heap中后,每次取数据后只向右侧进行扩展。

cpp 复制代码
class Solution {
public:
    struct node
    {
        int val;
        int x, y;

        // 取巧定义比较函数
        bool operator < (const node& other) const
        {
            return val > other.val;
        }
    };

    node Add(int val, int x, int y)
    {
        return node{ val, x, y };
    }

    // K对最小数组
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) 
    {
        // 默认为大顶堆,但是定义特殊比较函数,因此为小顶堆
        priority_queue<node> q;
        vector<vector<int>> ans;
        int n, m;
        n = nums1.size(); m = nums2.size();
        for (int i = 0; i < min(k, n); i++)
        {
            q.push(Add(nums1[i]+nums2[0], i, 0));
        }
        while (!q.empty() && k)
        {
            node tmp = q.top(); q.pop(); 
            k--;
            int x, y;
            x = tmp.x, y = tmp.y;
            ans.push_back({nums1[x], nums2[y]});
            // 只进行向右侧进行扩展
            if(y < m-1)
                q.push(Add(nums1[x] + nums2[y + 1], x, y + 1));
        }
        return ans;
    }
};
相关推荐
小O的算法实验室19 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生20 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿20 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz21 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能21 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****21 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能21 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能21 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo21 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ021 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法