搜索二维数组(面试题3)
2018-02-24 04:22
225 查看
写出一个高效的算法来搜索 m × n矩阵中的值。这个矩阵具有以下特性:每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
思路:由例子可以看出所有数字的左边那个数总是小于本身,下方那个数总是大于本身。因此,我们可以从数组的右上角那个数出发逐步寻找我们所需要找的数:如果目标小于当前数字,我们必定不希望当前数字变得更大,所以应该把当前数字变为自己左边的那个数(较小的那个数);反之则变成下方那个数(较大的数)。当这个数字成功被找到则返回true,当当前数字的横纵坐标超出范围还没有找到这个数,则返回false。
代码:public class Solution {
public boolean Find(int target, int[][] array) {
if (array == null || array.length == 0 || array[0].length == 0) {
return false;
}
int row = 0, col = array[0].length - 1;
while (row <= array.length - 1 && col >= 0) {
if (array[row][col] == target) {
return true;
} else if (array[row][col] > target) {
col--;
} else
row++;
}
return false;
}
}
每行的第一个数大于上一行的最后一个整数。
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]查找17,return true; 查找20,return false。
思路:由例子可以看出所有数字的左边那个数总是小于本身,下方那个数总是大于本身。因此,我们可以从数组的右上角那个数出发逐步寻找我们所需要找的数:如果目标小于当前数字,我们必定不希望当前数字变得更大,所以应该把当前数字变为自己左边的那个数(较小的那个数);反之则变成下方那个数(较大的数)。当这个数字成功被找到则返回true,当当前数字的横纵坐标超出范围还没有找到这个数,则返回false。
代码:public class Solution {
public boolean Find(int target, int[][] array) {
if (array == null || array.length == 0 || array[0].length == 0) {
return false;
}
int row = 0, col = array[0].length - 1;
while (row <= array.length - 1 && col >= 0) {
if (array[row][col] == target) {
return true;
} else if (array[row][col] > target) {
col--;
} else
row++;
}
return false;
}
}
相关文章推荐
- 面试题3:二维数组中的查找
- 剑指offer-面试题3 二维数组中的查找
- 【剑指offer】面试题4:二维数组的查找
- 【剑指offer】2.3.1 数组——面试题3:二维数组中的查找
- 面试题3:二维数组中的查找
- 剑指Offer面试题3:二维数组中的查找
- [剑指offer]面试题3:二维数组中的查找
- 剑指offer面试题 二维数组的查找
- 面试题常见算法之图的广度优先搜索和深度优先搜索
- 剑指Offer 面试题三:二维数组中的查找
- 剑指offer——面试题4:二维数组中的查找
- P38、面试题3:二维数组中的查找
- 面试题3-------二维数组中的查找(数组)
- 剑指offer——面试题3二维数组
- 《剑指offer》面试题3:二维数组中的查找
- 剑指offer面试题3:二维数组中的查找
- 二分搜索面试题C++
- 剑指offer 面试题3:二维数组中的查找
- 剑指offer面试题3二维数组的查找
- 面试题28:二叉树搜索的后序遍历序列