判断二维数组中是否有给定元素,暴力解的话时间复杂度O(n^2),无法通过测试。
所给的二维数组实际上是有序的,每一行从左至右是递增的,而每一列从上到下是递增的,利用这个特性我们可以更快速的求解此问题。
我们可以从右上角的元素开始和所给的整数去比较,因为右上角的元素有这样一个特性,它左边的元素都比它小,而下面的元素都比它大,如果给定的整数比它大,意味着这一行的元素都比它小,也就不可能再有这个整数了,而给定的整数如果比它小,这一列的元素都比它大,也不会含有这个整数,我们每一次的比较,都可以排除一行,或一列元素,这样的效率是很高的。
target = 11,二维数组如下:
[1,3, 5,7]
[10,11,16,20]
[23,30,34,50]
首先比较7 < 11,所以我们排除第一行,比较本列的下一个元素。
[1,3, 5,7]
[10,11,16,20]
[23,30,34,50]
因为20 > 11,所以我们排除这一列,比较本行的前一个元素。
[1,3, 5,7]
[10,11,16,20]
[23,30,34,50]
同理,排除16所在的那列,继续比较本行的前一个元素。
[1,3, 5,7]
[10,11,16,20]
[23,30,34,50]
最后找到11这个元素,返回true即可。时间复杂度是O(m+n),即二维数组的行列之和。
C++
class Solution { public: bool Find(int target, vector<vector<int> > array) { if(array.empty()) return false; int m = array.size(); int n = array[0].size(); int x = 0; int y = n-1; while(x < m && y >= 0){ if(array[x][y] > target){ y--; } else if(array[x][y] < target){ ++x; } else{ return true; } } return false; } };
Java
public class Solution { public boolean Find(int target, int [][] array) { if(array == null) return false; int m = array.length; int n = array[0].length; int x = 0; int y = n-1; while(x < m && y >= 0){ if(array[x][y] > target){ --y; } else if(array[x][y] < target){ ++x; } else{ return true; } } return false; } }
原文:https://www.cnblogs.com/silentteller/p/11762414.html