恒生2020秋招笔试编程题:在一个二维数组中,每一行都按照从左到右递增顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public class Solution {
public boolean Find(int target, int [][] array) {
//对数组进行循环遍历
for(int i = 0;i < array.length;i++)
for(int j = 0;j <array[i].length;j++){
if(array[i][j]=target)
return true;
}
return false
}
}
方法二:二分查找
public class Solution {
// 二位数组是从左到右递增,从上往下递增
public boolean Find(int target, int [][] array) {
/*
每一行元素都是有序递增的数组,可以对每一行数组二分查找
通过遍历每一行得到答案
时间复杂度为nlogn
*/
//对数组进行循环
for(int i = 0;i < array.length;i++){
int low = 0;
int high = array[i].length - 1;
while(low <= high){
//取数组下标为中间元素
int mid = (low + high) / 2;
if(target > array[i][mid]){
low = mid + 1;
}else if(target < array[i][mid]){
high = mid - 1;
}
else{
return true;
}
}
}
return false;
}
}
方法三:先从右上角开始找,如果比目标小,则本行无需查找,向下移动一行;如果比目标大,则在本行查找,向左移动一列;如果相等直接返回true
public class Solution {
/**
* 寻找目标是否在二维数组内
* @param array int整型二维数组 二维数组
* @param target int整型 目标值
* @return bool布尔型
*/
public boolean Find (int[][] array, int target) {
// write code here
int m = array.length, n = array[0].length;
int i = 0, j = n - 1;
while(i < m && j >= 0){
if(array[i][j] < target)
i++;
else if(array[i][j] > target)
j --;
else
return true;
}
return false;
}
}
并未上机测试,有问题欢迎指出。