《剑指offer》第一题(js)
菜鸡琳终于来刷剑指offer了QAQ,加油哇!!!
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1、暴力解法
题外话:第一反应就想到这个方法,于是心想这题真简单。然鹅去看别人的运行时间时…看来我的优化意识很需要再培养培养。
function Find(target, array)
{
// write code here
var row = array.length;
var column = array[0].length
for (var i = 0; i < row; i++){
for (var j = 0; j < column; j++){
if (array[i][j] === target)
return true;
}
}
return false;
}
运行时间:74ms,占用内存:8132k
2、遍历每一行,每行用二分法
function Find(target, array)
{
// write code here
var rowlen = array.length;
for(var i = 0; i < rowlen; i++){
var left = 0,
right = array[i].length - 1;
while(left <= right){
var middle = Math.floor((left + right)/2);
// Math.floor()向下取整,Math.ceil()向上取整
// 这里我和c弄混了,以为相除会得到整数orz
if(target < array[i][middle]){
right = middle-1;
}else if(target > array[i][middle]){
left = middle +1;
}else{
return true;
}
}
}
return false;
}
运行时间:59ms,占用内存:7948k
3、用api array.some
但本质和暴力解法差不多,都是要遍历每一项
function Find(target, array)
{
return array.some(arr=>arr.some(e=>e===target))
}
运行时间:81ms,占用内存:8160k
4、好方法:从左下开始找
重点:有序。从左下开始找,如果比目标值小,则在同一行找,如果比目标值大。则往上一行找。
while(line=readline()){ // 逐行读取
var index = line.indexOf(',');
var left = parseInt(line.substring(0,index));
var right = JSON.parse(line.substring(index+1));
print(Find(left,right))
}
function Find(target, array)
{
// write code here
lenX = array.length;
lenY = array[0].length;
for (var i = lenX - 1, j = 0; i >= 0 && j < lenY;) {
if (target > array[i][j]) {
j++;
}
else if (target < array[i][j]) {
i--;
}
else {
return true;
}
}
return false
}
运行时间:15ms,占用内存:5876k