经典面试算法题:线性查找有序二维数组

从右上角开始搜索,当前的元素map[x][y]和要搜索的数n有如下可能:

map[x][y]==n --> 返回true
map[x][y]>n   --> 向左移动
map[x][y]<n   --> 向下移动

搜索过程例子:

AC代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);

        int n=sc.nextInt();
        int m=sc.nextInt();
        int k=sc.nextInt();

        int x[][]=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                x[i][j]=sc.nextInt();
            }
        }

        boolean ans=search(x,k);
        System.out.println(ans);

    }

    public static boolean search(int map[][],int n){
        int x=0,y=map.length-1;
        while(x<map.length && y>=0){
            if(map[x][y]==n) return true;
            else if(map[x][y]<n) x++;
            else if(map[x][y]>n) y--;
        }
        return false;
    }
}

生成测试数据的代码:

import java.util.Random;

public class Main_007 {

    public static void main(String[] args) {

        int x[][]=gen(10,10);

        show(x);

    }

    public static int[][] gen(int n,int m){
        int res[][]=new int[n][m];

        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                int max=0;
                if(i-1>=0) max=res[i-1][j];
                if(j-1>=0) max=Math.max(max,res[i][j-1]);
                res[i][j]=new Random().nextInt(10)+max+1;
            }
        }

        return res;
    }

    public static void show(int x[][]){
        for(int i=0;i<x.length;i++){
            for(int j=0;j<x[i].length;j++){
                System.out.printf("%3d ",x[i][j]);
            }
            System.out.println();
        }
    }

}
时间: 2024-10-20 15:01:31

经典面试算法题:线性查找有序二维数组的相关文章

查找有序二维数组中的元素

给定一个已排序的二维数组array,在其中查找一个元素value 查找策略如下图: (1)将value和数组的右上角的值比较,如果大于右上角的值,则移除数组的第一行. (2)将value和数组的左下角的值比较,如果大于左下角的值,则移除数组的第一列. (3)直到查找完毕,已经找不到符合(1)(2)的情况后,或者数组只剩下一个元素 (4)得到一个较小的二维数组,再遍历该数组即可.             /** * Created by wuchao on 17-3-29. */ import j

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

剑指offer_快速查找递增二维数组中是否存在目标

[编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 完整通过代码: public class ArrayFind { public static void main(String[] args){ int a[][]={{1,2,3},{4,5,6},{7,8,9}}; System.out.println(Find(a,7)); } public sta

&nbsp; 动态开辟有序二维数组

#include<stdio.h>#include<stdlib.h>int main(){ //int arr[3][4] // int row; int col; scanf_s("%d%d", &row, &col); int  **q = (int **)malloc(sizeof(int)* row);//开辟一块空间 存储一个含有row数组指针的数组 q[0] = (int *)malloc(sizeof(int)*col); for

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

一.在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 首先选取数组中右上角的数字.如果该数字等于要查找的的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围. 实现过程如下: 运行结果如下:

有序二维数组中的查找

一个二维数组,每一行按照从左到右递增,每一列按照从上到下递增,查找数组中是否存在某个数.如数组: 1  2  8    9 2  4  9   12 4  7  10  13 6  8  11  15 思路: 这道题有其特殊性,从右上角或者左下角开始查找的方向是确定的.这句话是说比如是查找7,我们从右上角开始,9大于7,则减少列下标,查找13的话就增加行下表,查找的方向是确定的,这样就容易实现了. public class Item03 { public static void main(Str

数组的应用:冒泡排序,折半查找及二维数组的应用

人类思维--计算机逻辑思维 逻辑思维--代码实现 写书法: 描红——临摹——碑贴——自成一体——草 复习: 数组:一维,二维,多维 一维:豆角.连续,同一类型. 定义:数据类型[] 数组名=new 数据类型[长度]{.,.,.,.}; 赋值:数组名[下标] = 值 取值:数组名[下标] 灵活运用:与for循环的结合应用. 1.求最大值,最小值. 2.求总和,平均. 3.随机(生成下标)抽值. 数组的应用: (一).冒泡排序. 1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数. 2

数组的应用:一。冒泡排序二。折半查找!二维数组的学习。

数组的应用:(一).冒泡排序.1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.2.趟数=n-1:次数=n-趟数.3.里层循环使用if比较相临的两个数的大小,进行数值交换. 作业:1.先把冒泡排序写一遍.2.使用冒泡排序,做青歌赛的打分程序.要求去掉两个最高,两个最低分,求平均得分. 代码. (二).折半查找.前提:数组必须是有序的.思路:用两个变量分别代表上限(top)和下限(bottom)的下标,再用一个变量代表中间(mid)的下标.1.求中间下标:mid = (top+bo

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述 写一个高效的算法,从一个m×n的整数矩阵中查找出给定的值,矩阵具有如下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键.实际上我们可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd),其中limu=0,使得matrix[0][0]≤matrix[i][0]≤matrix[limd][0],i∈[0,limd].而确定limd的值可以使用二分法.