如何实现数组查找
牛客网上的问题描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
自己写了一个很简单的二次循环查找。(在这里边考虑了如果不是数组的情况,本来想写一个自身循环调用的写法,但是都失败了==!)
/** * * @param {number} target * @param {number[]} array */ function Find(target, array) { var len = array.length; var flag = false; for(var i=0; i< len; i++) { var ele = array[i]; if(typeof ele !== 'object') { if(target === ele) { flag = true; continue; } } else { var idx = ele.indexOf(target); //flag = (idx!=-1)&&true; if(idx !== -1) { flag = true; } } } return flag; }
在牛客网上分享区里找到了一个思路,因为题目描述是顺序从左至右排列,可以利用二叉树查找的方法。
function Find(target, array) { for(var i=0; i<array.length; i++) { var low = 0, ele = array[i]; var high = ele.length - 1; while(low <= high) { var mid = Math.floor((low+high)/2); if( target < ele[mid]) { high = mid - 1; }else if( target > ele[mid] ) { low = low + 1; } else { return true; } } } return false; }
2.
/** * 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 *你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 * @param {number[]} nums * @param {number} target * @return {number[]} */ function twoSum(nums, target) { var res =[]; for(var i=0; i<nums.length;i++) { for(var j=i+1; j<nums.length; j++) { if(i !== j && (nums[i] + nums[j]) === target) { res.push(i); res.push(j); break; } } } return res; };