剑指offer:二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
//思路:首先选一个右上角的元素,当target大于这个元素,说明不在这一行,直接下一行(排除此行)(i++)
// 当target小于这个元素,说明这一列向下都没有,找前一列(排除此列) j--
ac代码:
class Solution { public: //思路:首先选一个右上角的元素,当target大于这个元素,说明不在这一行,直接下一行(i++) // 当target小于这个元素,说明这一列向下都没有,找前一列 j-- bool Find(int target, vector<vector<int>> &array) { int row = array.size(); //行 int col = array[0].size(); // 列 int i = 0, j = col-1; // j是最后一列 // bool flag = false; while(i < row && j >= 0) { if (target == array[i][j]) { return true; } else if (target > array[i][j]) // 大于前行的最后一个,说明不在这一行i++ { i++; } else if (target < array[i][j]) // 小于当前行的最后一个,说明不在这一列,j-- { j--; } } return false; } };
加上main函数的版本
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 // 判断当前行的最后一个数是否大于目标值, 5 //如果大于则当前行不存在,进入下一行 6 class Solution { 7 public: 8 bool Find(int target, vector<vector<int> > &array) { 9 int row = array.size(); // 行 10 int col = array[0].size(); // 列 11 12 13 for(int i = 0; i < row; i++) 14 { 15 if (target > array[i][col-1]) 16 continue; 17 for( int j = 0; j < col; j++) 18 { 19 if (target == array[i][j]) 20 { 21 return true; 22 } 23 } 24 } 25 return false; 26 27 } 28 29 //思路:首先选一个右上角的元素,当target大于这个元素,说明不在这一行,直接下一行(i++) 30 // 当target小于这个元素,说明这一列向下都没有,找前一列 j-- 31 bool find2(int target, vector<vector<int>> &array) 32 { 33 int row = array.size(); //行 34 int col = array[0].size(); // 列 35 int i = 0, j = col-1; // j是最后一列 36 // bool flag = false; 37 38 while(i < row && j >= 0) 39 { 40 if (target == array[i][j]) 41 { 42 return true; 43 } 44 else if (target > array[i][j]) // 大于前行的最后一个,说明不在这一行i++ 45 { 46 i++; 47 } 48 else if (target < array[i][j]) // 小于当前行的最后一个,说明不在这一列,j-- 49 { 50 j--; 51 } 52 } 53 return false; 54 } 55 }; 56 int main() 57 { 58 Solution s; 59 int t = 1; 60 vector<vector<int> > arra(4,vector<int>(3,0)); // 4行三列 61 for (int i = 0; i < 4; i++) 62 { 63 for (int j = 0; j < 3; j++) 64 { 65 arra[i][j] = t++; 66 } 67 } 68 for (int i = 0; i < 4; i++) 69 { 70 for (int j = 0; j < 3; j++) 71 { 72 cout << arra[i][j]<<" "; 73 } 74 cout << endl; 75 } 76 77 cout << endl; 78 bool falg = s.find2(40, arra); 79 cout << falg; 80 81 return 0; 82 } 83 //std::vector<std::vector<int> > vec(row,vector<int>(col,0)); 84 //初始化row * col二维动态数组,初始化值为0