每日算法刷题Day31 6.14:leetcode二分答案2道题,结束二分答案,开始枚举技巧,用时1h10min

7. 1439.有序矩阵中的第K个最小数组和(困难,学习转化为373)

1439. 有序矩阵中的第 k 个最小数组和 - 力扣(LeetCode)

思想

1.给你一个 m * n 的矩阵 mat,以及一个整数 k ,矩阵中的每一行都以非递减的顺序排列。

你可以从每一行中选出 1 个元素形成一个数组。返回所有可能数组中的第 k 个 最小 数组和。

2.转化为373.查找和最小的K对数字,利用最小堆,373是从两个数组找前K个,而此题是m*n矩阵,但是发现假设已经取完矩阵前两行的数组和,再考虑第3行时,只要考虑前两行数组前K个值即可(因为后面的不可能是最终的K个最小数组和),所以问题就转化为得到前面i-1行的最小K个数组和数组,然后第i行考虑进来,最终再得到一个最小K个数组和数组,实现行的压缩

3.初始数组为只有0元素的数组和第一行(表示取第一行前K个元素)

代码

c++:

复制代码
class Solution {
public:
    vector<int> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        int n1 = nums1.size(), n2 = nums2.size();
        priority_queue<tuple<int, int, int>> pq;
        vector<int> res;
        for (int i = 0; i < min(n1, k); ++i) {
            pq.emplace(-nums1[i] - nums2[0], i,
                       0); 
        }
        while (!pq.empty() && res.size() < k) {
            auto t = pq.top();
            pq.pop();
            int i = get<1>(t), j = get<2>(t);
            res.push_back(nums1[i] + nums2[j]);
            if (j + 1 < n2)
                pq.emplace(-nums1[i] - nums2[j + 1], i,
                           j + 1); 
        }
        return res;
    }
    int kthSmallest(vector<vector<int>>& mat, int k) {
        int n = mat.size();
        vector<int> ini = {0};
        for (auto& row : mat) {
            ini = kSmallestPairs(row, ini, k);
        }
        return ini.back();
    }
};
8. 786. 第K个最小的质数分数(中等)
思想

1.给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr1 和若干 质数 组成,且其中所有整数互不相同。

对于每对满足 0 <= i < j < arr.lengthij ,可以得到分数 arr[i] / arr[j]

那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i]answer[1] == arr[j]

2.依旧转化为373.查找和最小的K对数字,只不过nums2是倒序的arr,且多个条件i+j!=n-1

代码

c++:

复制代码
class Solution {
public:
    vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {
        int n = arr.size();
        vector<int> arr2 = arr;
        vector<vector<int>> res;
        reverse(arr2.begin(), arr2.end());
        priority_queue<tuple<double, int, int>> pq;
        for (int i = 0; i < min(n - 1, k); ++i)
            pq.emplace(-1.0 * arr[i] / arr2[0], i, 0);
        while (res.size() < k && !pq.empty()) {
            auto t = pq.top();
            pq.pop();
            int i = get<1>(t), j = get<2>(t);
            if (i + j == n - 1)
                continue;
            res.push_back({arr[i], arr2[j]});
            if (j + 1 < n)
                pq.emplace(-1.0 * arr[i] / arr2[j + 1], i, j + 1);
        }
        return res.back();
    }
};
相关推荐
YH55269846 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务7 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶7 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆8 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索9 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
官乐11 小时前
AI面试指南(多agent开发流程)
人工智能·面试·职场和发展
北风toto11 小时前
中缀、前缀、后缀表达式
算法·软件设计师
程序员三藏11 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
听取WA声一片(无恶意)11 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
跟我一起学测试呀11 小时前
软件测试面试总结,备战金九银十
面试·职场和发展