文章
54
粉丝
1100
获赞
1515
访问
129w
这道题考试的时候可以n*m再快速查找,据说也是能通过的,虽然时间复杂度不达标,每年都有这种情况,24年也有
正解是二分
时间复杂度:排序的时间复杂度为 O (n log n + m log m),二分查找的时间复杂度为 O ((n + m) log r),其中 r 是二分查找的范围,所以总的时间复杂度为 O ((n + m) log r)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 检查矩阵中大于等于 mid 的元素个数是否不少于 K
bool check(const vector<int>& A, const vector<int>& B, long long mid, int K) {
int n = A.size();
int m = B.size();
long long count = 0;
for (int i = 0; i < n; ++i) {
if (A[i] > 0) {
// 找到满足 A[i] * B[j] >= mid 的最小的 j
int left = 0, right = m - 1;
int pos = m;
while (left <= right) {
int midIndex = left + (right - left) / 2;
if ((long long)A[i] * B[midIndex] >= mid) {
pos = midIndex;
right = midIndex - 1;
} else {
left = midIndex + 1;
...
登录后发布评论
暂无评论,来抢沙发