题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
题目连接:
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
 
 
 
代码:
package com.sunshine.OFFER66_SECOND;

import org.junit.Test;

public class A1_Find {

    @Test
    public void test() {
        int[][] arr = {
                {
                        1, 2, 8, 9
                },
                {
                        2, 4, 9, 12
                },
                {
                        4, 7, 10, 13
                },
                {
                        6, 8, 11, 15
                }
        };
        //7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
        boolean find = Find(7, arr);
        System.out.println(find);
        boolean find2 = Find2(1, arr);
        System.out.println(find2);
        boolean find3 = Find3(16, arr);
        System.out.println(find3);
    }

    //暴力
    public boolean Find(int target, int[][] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (target == array[i][j]) {
                    return true;
                }
                if (target < array[i][j]) {
                    break;
                }
            }
            if (array[i].length > 0 && target < array[i][0]) {
                break;
            }
        }
        return false;
    }

    //二分
    public boolean Find2(int target, int[][] array) {
        for (int i = 0; i < array.length; i++) {
            int l = 0;
            int r = array[i].length - 1;
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (mid < 0) {
                    break;
                }
                if (target == array[i][mid]) {
                    return true;
                }
                if (target < array[i][mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }
        }
        return false;
    }

    //利用数组有序性:左下角或右上角不同方向值增大或减小
    public boolean Find3(int target, int[][] array) {
        int i = 0;
        int j = array.length - 1;
        while (j >= 0 && i < array[0].length) {
            if (target == array[i][j]) {
                return true;
            }
            if (target < array[i][j]) {
                j--;
            } else {
                i++;
            }
        }
        return false;
    }
}

 

posted on 2019-08-26 17:15  MoonBeautiful  阅读(149)  评论(0编辑  收藏  举报