在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3

给定一个二维数组,数组的特点是:每一行从左到右数据大小依次递增,每一列数据从上到下依次递增,要求判断一个整数是否在这个二维数组中;

设计二维数组如下:

首先,毋庸置疑的的是,遍历一遍数组肯定能判断出来,这也是最笨的方法了,因此,要想提高程序的运行效率就得找出一种高效的方法来查找;

一开始的想法大概都能想到从数组第一行第一列的数开始沿着对角线判断,如果是对角线数据就可以直接返回,比如我们要想查找17这个数,这时候170、9、16都要大,因此以0、9、16为对角线的矩形数据就可以排除了,接下来判断21发现比17大要停下来,因此17这个数就卡在比16大但是比21小的范围内,但是这个范围可画如下图:

如图上所示,白色区域内的数据都可以排除,但是满足目前为止的判断条件的数据都是黄色区域内的数据,由于上面给出的数组是给定死了的,但实际上确实是黄色区域内的数据都可能满足条件;

然后呢?然后就卡住了......这样也就是不好再往下执行了,因此这种思路会阻塞,可以换一种思路重新开始判断;

首先,可以从数组的右上角开始判断,试想,如果要查找的数比右上角的数要小的话,那么右上角所在的那一列都可以被排除了,当然如果等于右上角的话就直接返回了,而如果要查找的数比右上角的数要大的话,那么右上角所在的那一行都可以排除了,当判断之后所排除的那一行或者那一列不在考虑范围之内了之后,再次寻找剩下的右上角的数据,依次循环判断,直到行从0变到最大值,列从最大值变为0为止;

代码可实现如下:

#include <iostream>
#include <assert.h>
using namespace std;

bool SearchNum(int (*parr)[5], size_t row, size_t col, int num)
{
    assert(parr);
    size_t tmp_row = 0;
    size_t tmp_col = col-1;

    while((tmp_row < row) && (tmp_col >= 0)) 
    {   
        if(parr[tmp_row][tmp_col] == num)
            return true;
        else if(parr[tmp_row][tmp_col] > num)
            --tmp_col;
        else
            ++tmp_row;
    }   
    return false;
}

int main()
{
    int arr[5][5] = {{0,  1,  2,  3,  4}, 

                     {5,  9, 10, 11, 12},

                     {6, 13, 16, 17, 18},

                     {7, 14, 19, 21, 24},

                     {8, 15, 22, 23, 25}};

    bool ret = SearchNum(arr, 5, 5, 17);  //success return true, failed return false
    if(ret)
        cout<<"the num is exist..."<<endl;
    else
        cout<<"the num is not exist..."<<endl;
    return 0;
}

当要查找的数为17的时候,运行程序结果如下:

当将要查找的数字改为20的时候,程序运行如下:

《完》

时间: 2024-12-09 18:56:44

在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3的相关文章

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

在一个按行列递增的二维数组中查找一个数是否存在

唯一要求:二维数组按行列递增 巧妙的利用二分法的特性,先跟右上角的元素相比,大于行+1,小于列-1,否则返回行列 #include<iostream> using namespace std; #define M 3 void array_bsearch(int array[][M],int value) { int i=0;//行 int j=M-1;//列 while(i<sizeof(array)/M) while(j>=0) { if(value > array[i]

在二维数组中查找一个数,二维数组是从左到右,从上到下依次递增

public class FindNum { public static boolean findANum(int[][] array, int target) { int row = array.length;//行数 int cloumn = array[0].length;//列数 int i = 0; int j = cloumn - 1; boolean found = false; while(i <= row-1 && j >= 0) { if(target &l

在一个二维数组中,每一行都按照从左到右递增的顺序排序

/*  * 在一个二维数组中,  * 每一行都按照从左到右递增的顺序排序,  * 每一列都按照从上到下递增的顺序排序.  * 请完成一个函数,输入这样的一个二维数组和一个整数,  * 判断数组中是否含有该整数.  */ public static void main(String[] args) { int[][] array = {{1,2,3},{4,5,6},{7,8,9}}; System.out.println(Find2(1, array)); } /*  * 思路一:暴力遍历法  

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

剑指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

递增二维数组中的查找

/* * 二维数组从左到右,从上到下递增 * 查找输入的数,效率尽可能高 * 思路:从右上角或左下角开始查找 */ import java.util.Scanner; public class findTarget { public static boolean find(int [][]a,int rows,int cols,int target){ boolean found=false; int count=0;//移动次数 if(a!=null){ int row=0; int col=

在一个二维数组中,每一行都从左到右递增,每一列都从上到下递增,在这样一个数组里查找一个数

第一种: 思路: 二维数组是从左到右递增,从上到下递增,row为行数,col为列数,a[row-1][col-1]为最大数,如果剔除这一行,这一列,则最大数为a[row-2][col-2],如果要查找的num大于a[row-2][col-2]并且大于a[row-1][col-1],则在该row-1行和col-1列查找,照这样遍历. 这样太麻烦,效率太低,应当舍弃. #include<stdio.h> #include<stdlib.h> #include<assert.h&g