【发布时间】:2021-11-28 00:45:13
【问题描述】:
我在这个函数的时间复杂度方面遇到了一些问题,在我看来它是 O(nlogn),因为二分搜索(应用在矩阵的列中)花费 O(logn),而第一个 for 循环花费 O (n)(初始行数)。注意:矩阵总是 n*n 代码在这里
void findMaxTreasureAux(vector<vector<int>>& map, int columns, int& index_row, int& index_column, int limitsx) {
int med = columns/2;
int max = 0;
for (int i = 0; i < map.at(0).size(); i++) {
if (map[i][med+limitsx] > max) {
index_row = i;
max = map[i][med+limitsx];
}
}
if (med+1+limitsx < map.at(0).size() && map[index_row][med+1+limitsx] > max)
findMaxTreasureAux(map, med, index_row, index_column, med+1);
else if (med - 1 >= 0 && map[index_row][med-1] > max)
findMaxTreasureAux(map, med, index_row, index_column, limitsx);
else index_column = med+limitsx;
}
void findMaxTreasure(vector<vector<int>>& map, int columns, int& index_row, int& index_column) {
if (map.empty()) return;
index_column = 0;
index_row = 0;
findMaxTreasureAux(map, columns, index_row, index_column, 0);
}
【问题讨论】:
-
有什么问题?
-
不知道我计算的时间复杂度是否正确。我不知道这种情况下的时间复杂度应该是 O(logn)*O(n) = O(nlogn) 还是 O(n) + O(logn) = O(n)。或者他们都是不正确的
-
这段代码有什么作用?我不知道你在搜索什么。
-
我正在矩阵中搜索具有此功能的数字:相邻的数字(水平和垂直)必须更低。示例 1 2 9 0 7 4 2 6 9 在这种情况下 7 是一个好数字,因为它大于 2、4、0 和 6。本练习中的矩阵可能有多个“好”数字。我通过了所有测试用例,代码应该可以工作
-
@JohnFilleau 我认为它有效,因为它实际上是变相的梯度上升(只是不必要的复杂并且做的工作比必要的多)。如果您从任意位置开始并从该位置走到更高的邻居,迟早您会用完更高的邻居并达到局部最大值。
标签: c++ time-complexity binary-search