第一题
题目
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
思路
思路一: 粗暴查找(两层循环,遍历所有array)——可用二分法提高查找效率
思路二:
- 假定
target=9,由二维数组的左下角(右上角亦可,这里不重复演示)作为入口,即29。
- 为什么以左下角或右上角为入口?
基于题目的二维数组具有有序性,以左下角为例
当target>当前数字,则往右继续寻找下一个目标来和target做对比。
当target<当前数字,则往上继续寻找下一个目标来和target做对比。
而左上、右下,周边均为大于当前值的值,无法根据 target与当前数字的对比作出准确的行为。

- 基于数组的有序性,9<29,则往上走

- 9<25,则继续往上走

- …
- 最后过程如下:

代码实现
思路一代码:
(双层粗暴查找)
function Find(target, array)
{
for(var i = 0; i < array.length; i++){
for(var j = 0; j < array.length; j++){
if(target === array[i][j]){
return true
}
}
}
return false
// write code here
}
(双层二分查找)
var len = array.length
for(var i = 0; i < len; i++){
var low = 0
var heigh = len - 1
var middle = Math.floor((low+heigh)/2)
while(low <= heigh){
if(target === array[i][middle]){
return true
}else if(target<array[i][middle]){
heigh = middle - 1
}else{
low = middle + 1
}
middle = Math.floor((low+heigh)/2)
}
}
return false
思路二代码:
(“路线”查找)
function Find(target, array)
{
var len = array.length - 1
var index = 0
while( !array[len] || target !== array[len][index] ){
if( !array[len] || !array[len][index] ){
return false
}
if( target > array[len][index] ){
index+= 1
}else{
len -= 1
}
}
return true
// write code here
}

这篇博客讨论了如何在已知条件的二维数组中查找特定整数。题目要求数组每一行和每一列都是有序的。文章提出了两种思路:一是使用两层循环的粗暴查找,可以优化为二分查找;二是从左下角开始,根据目标值与当前值的关系确定搜索方向。文章提供了相应的代码实现。
172万+

被折叠的 条评论
为什么被折叠?



