昨天半夜的一道题。数组
一个长度为N的数组,每一个元素为0~9的数字,将其从大到小进行排序。函数
function Find(array){
var box = new Array(10).fill(0);
var arrayBox = [];
array.forEach(function(value,index){
box[value]++;
})
for(let j = box.length-1 ; j >= 0 ; j--){
for(let i = 0 ; i < box[j] ; i++){
arrayBox.push(j);
}
}
return arrayBox;
}
复制代码
在一个二维数组中(每一个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。ui
外层函数循环,第一个参数进行判断,若是第一个参数都大于目标数,那么不须要进行遍历,直接输出false,
若是小于目标数,对内层函数进行every循环,若是数字小于目标数,继续进行循环,
若是没有,判断是否相等,若是相等输出true,并结束循环,
若是大于就退出本次内层循环。spa
function Find(target, array) {
var have = false;
array.forEach(function(value,index){
//若是第一个数大于目标数,就返回false
if(have == true || value[0] > target){
return false;
//第一个数不大于目标数,进入第二层循环
} else {
//若是里面的数小于目标数,就循环,若是大于目标数,就退出循环,若是等于也退出循环
value.every(function(v,i){
if(v < target){
return true;
}else{
if(v == target){
have = true;
}
return false;
}
})
}
})
return have;
}
复制代码
空间复杂度是1,时间复杂度是M×N3d
将二维数组弄成棋盘,外层为排,内层为列。
code
function Find(target, array) {
//肯定右上角起点坐标array[i][j] = array[0][array[0].length -1]
//横排变量
var i = 0;
//竖排变量
var j = array[0].length -1;
//循环进行判断
while(true){
//判断边界,若是超出了左下角就退出循环而且返回false
if(i >= array.length || j < 0){
return false
}
//若是没有超出边界,就判断是否相等,若是相等直接跳出循环而且返回true
if(target == array[i][j]){
return true
}
//若是没有达到跳出循环条件,那么判断是该往下走仍是往左走
if(target > array[i][j]){
i++;
}else{
j--;
}
}
}
复制代码
空间复杂度是O1,时间复杂度是M+Ncdn