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

二维数组中的查找

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


public class Solution {
    public boolean Find(int target, int [][] array) {
        if (0 == array.length) {
            return false;
        }
        if (1 == array.length) {
            if (0 == array[0].length) {
                return false;
            }
            return array[0][0] == target ? true : false;
        }
        // 具体代码实现
        // 思路:假设这个二维数组是一个方阵,我们只需要沿着对角线找就好了
        /*
         * 如果对角线上的某个值小于target,那么就以该位置为起点,向左画一条线,向上画一条线,然后,这一部分的值的大小一定也是小于target值的。(看不懂这段话,就自己作个图,不难的)
         * 如果对角线上的某个值等于target,那么很好,直接返回true即可。
         * 如果对角线上的某个值大于target,那么就以当前位置为起点,向右画一条线,向下画一条线,然后,这两条线围成的部分就不需要再进行查找了。同时,我们一共划分出了四个区域。然后使用递归,对另外没被直线围起来的两个区域进行查找,最终返回结果。
         * 强调一下,我们假设了这个二维数组是一个方阵。非方阵的做法有一丢丢不同。
         */
        // 定义一个整型变量,用于临时存放数据
        int tmp = 0;
        // 定义一个计数器
        int acc = 0;
        
        /******************************************************************************************************/
        // 我就知道,题目没有说明,那二维数组就不一定是方阵(最后一组用例错了,报了数组越界)
        // 定义一个整型变量,用于存放二维数组一维的长度
        int il = array.length;
        // 定义一个整型变量,用于存放二维数组二维的长度
        int jl = array[0].length;
        
        // 如果是方阵,才使用下列方法
        if (il == jl) {
            // 说明一下,i 是横坐标,j 是纵坐标
            for (int i = 0, j = 0; i < il && j < jl; i++, j++) {
                tmp = array[i][j];
                if (tmp == target) {
                    // 如果等于目标值,爽歪歪,直接返回
                    return true;
                }
                else if (tmp < target) {
                    // 如果小于目标值,继续沿着对角线向右下方向进行移动
                }
                else {
                    // 如果大于目标值,那么就以当前位置为起点,向右画一条线,向下画一条线,然后,这两条线围成的部分就不需要再进行查找了。同时,我们一共划分出了四个区域。然后使用递归,对另外没被直线围起来的两个区域进行查找,最终返回结果。
                    // 好吧,递归失败了,主要是我不知道怎么用Java切割一个二维数组。那么我们换个思路,计数器的作用就是,后续的遍历,不需要一直遍历到(i, j)这个位置,只需要在(i - k, j - k)位置即可
                    for (int k = 0; k < i - acc; k++) {
                        tmp = array[i][k]; // 从左往右
                        if (tmp == target) {
                            return true;
                        }
                        tmp = array[k][j]; // 从上往下
                        if (tmp == target) {
                            return true;
                        }
                    }
                    acc++;
                }
            }
            return false;
        }
        else { // 如果是非方阵
            // 下面代码是看了某个大佬才写出来的
            // 定义两个指针
            int ip = 0;
            int jp = jl - 1;
            while (ip < il && jp >= 0) {
                tmp = array[ip][jp];
                if (tmp == target) {
                    return true;
                }
                else if (tmp < target) {
                    ip++;
                }
                else {
                    jp--;
                }
            }
            return false;
        }
    }
}
全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440928次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41537次浏览 524人参与
# 北方华创开奖 #
107325次浏览 599人参与
# 地方国企笔面经互助 #
7930次浏览 18人参与
# 同bg的你秋招战况如何? #
75751次浏览 552人参与
# 虾皮求职进展汇总 #
114355次浏览 884人参与
# 阿里云管培生offer #
119911次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454159次浏览 34849人参与
# 实习必须要去大厂吗? #
55696次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149839次浏览 1977人参与
# 投递实习岗位前的准备 #
1195754次浏览 18547人参与
# 你投递的公司有几家约面了? #
33181次浏览 188人参与
# 双非本科求职如何逆袭 #
661963次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157606次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11402次浏览 275人参与
# 发工资后,你做的第一件事是什么 #
12447次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35638次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20093次浏览 240人参与
# 我的上岸简历长这样 #
451937次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39248次浏览 314人参与
# 非技术岗是怎么找实习的 #
155852次浏览 2120人参与
牛客网
牛客企业服务