题解 | #二维数组中的查找#

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

使用双二分查找分治、递归的方式进行
通过传入当前的两个方向的双指针进行遍历,得到当前的中间值(向下取整)坐标
用中间值坐标与target进行对比,然后如果是大于target
那么将会继续检测当前中间值的上半部分与左半部分,进行递归操作
直至最后找到对应的target则输出true、否则判断当前指针大小,没找到输出false。
因为当前递归将会不断进行,所以将会把这个递归函数作为if的判断条件,如果找到了那么就返回true,解决了递归的终止条件与输出返回值的问题

原有想法:
搜索完第一行,得到一个最接近target的中点
问题:
没能搜索完全部的列数组,造成遗漏

本题遇到主要的问题
1、二维数组取值出问题,行列索引出错
2、分治后所要检测的数组值不够明确
3、递归终止的判断条件写错

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param target int整型 
 * @param array int整型二维数组 
 * @return bool布尔型
 */
export function Find(target: number, array: number[][]): boolean {
    // write code here
    //线性搜索
    //通过搜索每一个对应的值
   /* let i=array.length-1,j=0
    if(array.length==0) return false
    while(i>=0 && j<array[0].length) {
        if(array[i][j] < target ) {
            j++
        }
        else if(array[i][j]==target) {
            return true
        }
        else {
            i--
        }
    }
    return false*/
    //双重二分查找
    if(array.length ==0 ) return false
    //return double_binary(array,0,array[0].length-1,0,array.length-1,target)
    return double_binary(array,0,array.length-1,0,array[0].length-1,target)
}
 
function double_binary(array: number[][],x1:number,x2:number,y1:number,y2:number,target:number):boolean {
    if(x1>x2 || y1> y2) return false
    let midx = Math.floor((x1+x2)/2)
    let midy = Math.floor((y2+y1)/2)
    if(array[midx][midy]==target) return true
    if(array[midx][midy] > target) {
        //中点上部
        if(double_binary(array,x1,midx-1,y1,y2,target)) return true
        //中点左侧
        if(double_binary(array,midx,x2,y1,midy-1,target)) return true
    }
    else {
        //中点右侧
        if(double_binary(array,midx+1,x2,y1,y2,target)) return true
        //中点
        if(double_binary(array,x1,midx,midy+1,y2,target)) return true
    }
    return false
    }


全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:46
暑期就挂了,秋招还有机会吗
大聪明777:研发提前批,14号刚开的,官网上面的配图上有写。提前批没过的话,秋招还可以投,不过前面的笔试/面试记录会被保留,供秋招参考
26届校招投递进展
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务