在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1、最简单的方法,就是遍历整个二维数组,然后找到该整数就返回true,否则就返回false。
代码:
public class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++){
if(array[i][j]==target){
return true;
}
}
}
return false;
}
}
我出现的错误:我想先找到元素所在的行,然后再找列,找列的时候从0开始,但是发现如果该数在数组的最后一个,则没法返回正确的结果。
错误代码:
class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
for(int i=0;i<row;i++) {
if(array[i][0]>target){
for(int j=0;j<col;j++) {
if(array[i-1][j]==target) {
return true;
}
}
}
}
return false;
}
}
修改上述代码:先找到所在的行,然后列从最后一个元素开始遍历,需要注意判断一下数组是否为空。
public class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
if(row>0&&col>0){
for(int i=0;i<row;i++){
if(array[i][col-1]>=target){
for(int j=col-1;j>=0;j--){
if(array[i][j]==target){
return true;
}
}
}
}
}
return false;
}
}
百度了大神的优化方法:
代码:
class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
int i=0,j=col-1;
while(i<row&&j>=0){//从每一行的最后一个数开始遍历
if(array[i][j]<target){//当前值小于target,则遍历下一行
i++;
}else if(array[i][j]>target){//当前值大于target,则从后向前遍历本行
j--;
}else{
return true;
}
}
return false;
}
}
比较当前值和target的大小,如果当前值比target大,则开始从后向前遍历本行;如果当前值比target小,则i++开始遍历下一行。