今天在练习算法时,有一个用二分法查找一个从上之下递增、从左至右递增的二维数组里是否有某一个数,写出传入一个这样的数组和一个数字判断是否这个数字在这个数组的函数。
好啦,相信有不少人做过这个题目。思路就是从左下角开始判断,如果目标数小,就向上走一格(因为上面的比下面小),如果目标数大,就向右走一格(因为右边比左边大)。这个思路一出,我顿时自信满满才思泉涌,蹭蹭写好点击提交,总是报错。如下是我一开始写的代码
public class Solution {
public boolean Find(int [][] array,int target) {
int m = array.length;
int n = array[0].length;
int x = m-1,y = 0;
while(x>=0 && y < n){
if (target < array[x][y]){
x--;
}
if (target > array[x][y]){
y++;
}
if (target == array[x][y]) {
return true;
}
}
return false;
}
}
报错因为下标越界了
我愣是皱眉查看代码三分钟,没有看出来为什么。后来搜一搜大家的答案,才恍然大悟
原来应该这样写
public class Solution {
public boolean Find(int [][] array,int target) {
int m = array.length;
int n = array[0].length;
int x = m-1,y = 0;
while(x>=0 && y < n){
if (target < array[x][y]){
x--;
}
else if (target > array[x][y]){
y++;
}
else {
return true;
}
}
return false;
}
}
其实答案跟我的思路是一样的,但是在条件语句上由于我的轻慢态度忽视了这个小小的if esle,那么 if if 和 if else 有什么不同呢
原来用 if if的话,每一个if 条件语句都要跑一遍,如果我走完第一个if 符合条件x减小了1,我还要在第二个if 里使用x再判断一遍,这样就不是初始的x 值了。
而用 if else 表示如果第一个 if 条件成立走完第一个if的代码块,后面就不用看了。这就是最显著的区别。
经过这次不能小瞧if else 和 if if 条件语句啊。
网友评论