思路迭代
- 第一次思考:循环整个数组 (254 ms 17652K)
- 第二次思考:循环最后一行,从最后一行最左边的数开始,左下角的数字比较特殊,与target比较,比target大就向上走,比target小就向右走(181 ms 17580K)
- 第三次思考:改进第二次思考,在向上走的时候用二分法 (171 ms 17460K)
代码展示
1
public class Solution {
public boolean Find(int target, int [][] array) {
for (int i=0;i<array[0].length;i++){
for (int j = 0;j<array.length;j++){
if (array[j][i] == target){
return true;
}
}
}
return false;
}
}
2
public class Solution {
public boolean Find(int target, int [][] array) {
int row_len = array.length;
if (row_len == 0){
return false;
}
int column_len = array[0].length;
if (column_len == 0){
return false;
}
if (target >= array[0][0] && target <= array[row_len -1][column_len -1] && (row_len != 0)&&(column_len != 0)){
for (int i = 0; i < row_len;i++){
if (array[i][column_len - 1] >= target){
for(int j = column_len -1; j >=0;j--){
if (array[i][j] == target){
return true;
}
}
}
}
}
return false;
}
}
3
public class Solution {
public boolean Find(int target, int [][] array) {
int row_len = array.length;
if (row_len == 0){
return false;
}
int column_len = array[0].length;
if (column_len == 0){
return false;
}
if (target >= array[0][0] && target <= array[row_len -1][column_len -1] ){
for (int i = 0; i < row_len;i++){
if (array[i][column_len - 1] >= target){
int low = 0;
int high = column_len -1;
int middle;
while( low <= high ){
middle = (low + high) /2;
if(array[i][middle] == target){
return true;
}
else if (array[i][middle] > target){
high = middle-1;
}
else {
low = middle+1;
}
}
}
}
}
return false;
}
}
注意
- 第二次的时候忘记考虑二维数组是空的情况,直接写了下面这样的代码,错误在于不一定有array[0]
int row_len = array.length;
int column_len = array[0].length;