让人瑟瑟发抖的面试题
。
。
。ios
来咱们看一下题目
在一个二维数组中,每一行都按照从左到右递增的顺序操做。每一列都按照从上到下递增的顺序排序。完成代码,输入这样一个二维数组和一个整数,判断数组是否含有该整数面试
怎么解决勒???
分析:若是二维数组是这样,为了解决问题彻底能够把数组遍历一遍,可是为了效率,咱们须要把时间复杂度下降,为了遍历最少的数字,咱们须要把行和列分开。因此,咱们会从数组中找一个数字进行判断,然而,随便找一个数字,只会让问题变的跟复杂,好比,找一个10,左边和上边都比10小,而下边和右边都比10大,因此,咱们只能找一些特殊点,好比,右上边,左下边,只会有一条路让你选择。a[row][col],咱们拿9举例,若所找数字比9大,只需row++;若所找数字比9小,只需col--;直到最后找到所需数字。
来看看代码数组
#include<iostream> using namespace std; bool find(int *arr, int row, int col, int n) { bool flag = false;//标记 if (arr != nullptr&&row > 0 && col > 0)//判断数组是否存在 { int _row = 0; int _col = col - 1; while (_col>0&&_row<row) { if (arr[_row*col + _col] > n) { _col--; } else if (arr[_row*col + _col] < n) { _row++; } else { flag = true; return flag; } } } return flag; } int main() { int arr[4][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } }; bool ret=find((int *)arr, 4, 4, 7);// cout << boolalpha << ret<<endl;//boolapha使返回值变成true输出 return 0; }