【面试题】剑指Offer-3-在二维数组中进行查找

来源:互联网 发布:淘宝旗舰版是什么意思 编辑:程序博客网 时间:2024/06/07 19:24

题目概述

给一个二维数组(例如下图),在二维数组的每一列,每一行中,元素的大小是递增的;如何快速判断一个数存不存在


解题思路

这里呢,从右上角开始判断,6的下标(0,2)

有四种情况

1、就是要查找的元素,则返回TRUE

2、比要查找元素大,则x坐标+1,缩小判断的范围

3、比要查找元素小,则y坐标-1,缩小判断的范围

4、范围内不包括任何元素,则表示没有找到,范围FALSE

图解


递归实现

//剑指第三题//题目:一个M*N数组//数组从上到下,从左到右为分别为增序//给一个数,如何快速判断其存不存在#include<iostream>using namespace std;#include<assert.h>const int M = 3;const int N = 3;//递归实现//缺点,可能导致栈溢出bool IsExist(const int* martix, int x, int y, int key){assert(martix);if (x < M && x >= 0 && y < N && y >= 0){int num = martix[x*M + y];if (num > key)return IsExist(martix, x, y - 1, key);else if (num < key)return IsExist(martix, x + 1, y, key);elsereturn true;}return false;}

非递归实现

//剑指第三题//题目:一个M*N数组//数组从上到下,从左到右为分别为增序//给一个数,如何快速判断其存不存在#include<iostream>using namespace std;#include<assert.h>const int M = 3;const int N = 3;//非递归进行实现bool IsExistNonR(const int* martix, int x, int y, int key){assert(martix);while (x < M && x >= 0 && y < N && y >= 0){int num = martix[x*M + y];if (num > key)y--;else if (num < key)x++;elsereturn true;}return false;}

测试函数

void TestFindNum(){const int martix[] = { 1, 4, 6,    2, 5, 7,    3, 6, 9  };int num = 0;cout << "请输入要查找的数:";cin >> num;cout << "IsExist:" << IsExist(martix, 0, M - 1, num) << endl;cout << "IsExist:" << IsExistNonR(martix, 0, M - 1, num) << endl;}


1 0
原创粉丝点击