我正在编写函数来检查给定值是否包含在矩阵中。该矩阵具有以下属性: •每行中的整数按从左到右的升序排序。 •每列中的整数按从上到下的顺序排序
public static boolean searchMatrix(int target, int[][] matrix)
{
for(int i = 0;i <= matrix[0].length;i++)
{
for (int j=i; j<matrix.length;j++)
{
if(target == matrix[i][j])
return true;
}
}
return false;
}
我想知道天气这个节目的时间复杂度为O(N)。 如果不是我应该做什么改变进入O(N)。
答案 0 :(得分:1)
我认为搜索可以在线性时间内完成。将以下4×4矩阵视为视觉:
1 2 4 6
2 3 5 7 ascending from left to right
3 4 6 8 and from top to bottom
4 5 6 9
如果我们搜索值5
,我们可以从左上角开始,然后向右走,直到我们找到该值,或者遇到一个大于目标5的数字。在这种情况下,我们点击6.然后,我们可以回滚到4,然后向下前进到更高的行。保证第一行中的每个先前值都小于目标,并且该列中的下一行中的每个值都大于第一行上的值。
这是一种粗略的线性方法。一个很好的类比就是在山的周围走动,寻找一定的高度。如果在每个地点,我们要么找不到我们想要的高度,要么只找到太高的点,我们就继续行走。
答案 1 :(得分:0)
你编写它的方式(暴力计算)的最坏情况时间复杂度为O(N ^ 2)。既然你说数组是排序的,你可以实现binary search,它的最坏情况时间复杂度为N(2 * log(N))。
答案 2 :(得分:0)
假设n x m矩阵,你的算法是O(n * m),因为它(可能)迭代所有行和列(即所有元素)。
但是,存在一种算法,即O(log(m + n))。
因为这是一次在线编码访谈(我很精神),我只会给你提示:
答案 3 :(得分:0)
如上所述,对于方阵,您的算法为O(N * M)或O(N ^ 2)。
你可以用一个循环来完成:
基本上从右上方开始,如果数字太大则检查单元格如果数字太小则向左移动。如果你从两侧的边缘掉下来,那么数字就不存在了。
beginingOfMonth
答案 4 :(得分:0)
你说矩阵是排序的,你可以使用二进制搜索来找到目标。并使用两个单独的一层循环,首先搜索行,然后是column.it的o(N / 2)。