《剑指Offer》面试题:二维数组中的查找

题目

题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。

输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。

思路

由于数组时有序的这样一个前提,因此

从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列;这样就可以将查找范围逐渐缩小,直至完成搜索

当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这样不能缩小查找范围)

测试用例

测试用例需要考虑的情况:

1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)

2)二维数组中不包含要查找的数字,会有如下三种情况:

2.1)要查找的值小于二维数组中的最小值

2.2)要查找的值大于二维数组中的最大值

2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。

3)特殊输入测试(空指针)

代码实现如下

/*
面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。
输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。

测试用例需要考虑的情况:
1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)
2)二维数组中不包含要查找的数字,会有如下三种情况:
    2.1)要查找的值小于二维数组中的最小值
    2.2)要查找的值大于二维数组中的最大值
    2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。
3)特殊输入测试(空指针)
*/

#include<stdio.h>
#include<string.h>
#define N  4
#define M  4
/*
@param  arr:指针数组
@param  rows:数组的行数
@param  columns:数组的列数
@param  num:需要查找的数 

*/

void findNumInArray(int (*arr)[N],int rows,int columns,int num){

    //先检查arr是否有效
    if(arr==NULL||rows<1||columns<1){
        return ;
    } 

    //开始在arr中寻找num是否存在
    //从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列
    int row=0;
    int column=columns-1;
    bool flag=false;
    while(row<rows&&column>=0){//num==arr[row*columns+column
        int temp=arr[row][column];
            if(num==temp){
            flag=true;
            break;//跳出while循环
        }
        else if(num<temp){//删除该列
            column--;
        }
        else{//删除该行
            row++; 

        }

    }
    if(flag==true){
        printf("%d在上面数组中存在\n",num);

    }
    else{
        printf("%d在上面数组中不存在\n",num);
    }

}

int main(void){
    int arr[N][M]={
    {1,2,3,7},
    {3,5,6,8},
    {4,7,8,9},
    {6,8,10,12}
    };
    //输出
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            printf("%d  ",arr[i][j]);
        }
        printf("\n");
    }
//  int num;
//  scanf("%d",&num);
    //测试用例如下
    int num1=1;//最小值,在arr中存在
    int num2=4;//中间值,在arr中存在
    int num3=12;//最大值,在arr中存在
    //维数组中不包含要查找的数字的三种测试用例
    int num4=0;
    int num5=20;
    int num6=11;

    findNumInArray(arr,N,M,num1);
    findNumInArray(arr,N,M,num2);
    findNumInArray(arr,N,M,num3);
    findNumInArray(arr,N,M,num4);
    findNumInArray(arr,N,M,num5);
    findNumInArray(arr,N,M,num6);
    return 0;
} 

运行结果如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 13:27:22

《剑指Offer》面试题:二维数组中的查找的相关文章

剑指offer编程-二维数组中的查找

二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. #include<iostream> #include<vector> using namespace std; class Solution { public: bool Find(int target, vector<vector<int> > array) {

剑指offer一:二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 这是一个顺序二维数组,可以从右下角处开始查找.本题中需要注意数组下限,不要忘记减一 public class Solution { public boolean Find(int target, int [][] array) { int row = 0; int col = array[0].length -1

《剑指Offer》题目——二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析: 暴力破解时间复杂度太高,本题有两种思路:1. 将每行看成一个有序数组,用二分查找2. 从左下角开始查找,若大于该值,右移:若小于该值,上移,直到找到为止 public class ArraySearch { public static boolean Find(int target, int [][] ar

《剑指Offer》之二维数组中的查找

1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 1 public class Solution { 2 3 public boolean Find(int[][] array,int target) { 4 5 for(int i = 0; i < array.length; i++){ 6 for(int j = 0; j < array[i].

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

剑指offer刷题—二维数组的查找

最近接触到一本书叫做剑指offer,在这里准备在这个2个月左右将这本书刷完,当然,不需要每天多少道什么的,不在多,一天理解一道就好了,希望能成为一种习惯,另外,准备在github上也进行同步分享. 今天第一道题: 面试题3:二位数组中的查找 当我们需要解决一个复杂问题时,一个很有效的方法就是从具体的问题出手,通过分析具体的例子,得到规律. 再一个二维数组中,每一行都要按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含

【剑指offer】规则二维数组查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从数组左下角开始判断,如果目标数据大于左下角数字,则列号右移(增加),若目标数字小于左下角数字,则行号上移(减小) public class Solution {     public boolean Find(int target, int [][] array) {         int ro

剑指Offer 面试题40:数组中只出现一次的两个数 题解

面试题40:数组中只出现一次的两个数 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193 或 http://ac.jobdu.com/problem.php?pid=1351 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 牛客网OJ的输入输出接口是:void Fin

剑指offer——面试题29:数组中出现次数超过一半的数

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 解法一:基