剑指offer的66题之第1题:二维数组查找
1 ////////////////////////////////剑指offer的66题之第一题:二维数组查找////////////////////////////////////////// 2 /*问题: 3 在一个二维数组中(每个一维数组的长度相同), 4 每一行都按照从左到右递增的顺序排序, 5 每一列都按照从上到下递增的顺序排序。 6 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 7 */ 8 9 10 ////////关于vector容器使用的测试 11 ////////参考代码:https://www.cnblogs.com/fuhang/p/9077624.html 12 //#include<iostream> 13 //#include<vector> //下面用到vector所以需要包含头文件 14 // 15 //using namespace std; //命名空间不能忘记 16 // 17 ////在主函数中,返回值类型为int类型 18 //int main() 19 //{ 20 // vector<vector<int>> array_td; //二维向量的格式对吗? 21 // 22 // vector<int> array_od(3, 2); //初始化格式对吗? 23 // 24 // for (int i = 0; i <= 4; i++) 25 // { 26 // array_td.push_back(array_od); //push_back用法:括号中是要压缩的元素(整数或向量) 27 // } 28 // //出错点:数组中最大索引值总是小于数组维度-1 29 // for (int i = 0; i < array_td.size(); i++) //array_td.size()中括号! 30 // { 31 // for (int j=0; j<array_td[0].size(); j++) 32 // { 33 // cout << array_td[i][j]; //二维数组的元素的引用 34 // } 35 // cout << endl; 36 // } 37 // return 0; //最后返回值为0,此句不要忘记 38 //} 39 40 /////////方法1:3种子方法中1,2种稍微精简一点;方法2:每行二分法;方法3:暴力解决查找 41 /////////启发:方法选择要选择最优:有了一种方法,应该问自己:有没有更好的方法?! 42 43 #include <iostream> 44 #include <vector> //头文件包含不要忘记! 45 46 using namespace std; //命名空间不要忘记! 47 48 ////从二维数组中查找数字的函数实现方法1(精简版1): 49 ////从右上角开始,数组中元素大于target值则向下寻找,小于target值则向左寻找 50 class solution 51 { 52 public: 53 bool Find(int target, vector<vector<int>> array)//子函数返回值类型要注意! 54 { 55 int row = 0; 56 int col = array[0].size() - 1; 57 while (row <= array.size() - 1 && col >= 0) 58 { 59 if (target == array[row][col]) //注意if--else if--else--用法 60 return true; 61 else if (target>array[row][col]) 62 row++; 63 else 64 col--; 65 } 66 return false; 67 } 68 };//类定义最后不能忘记分号 69 70 71 //////从二维数组中查找数字的函数实现方法1(精简版2): 72 //class solution { 73 //public: 74 // bool Find(int target, vector<vector<int> > array) { 75 // // array是二维数组,这里没做判空操作 76 // int rows = array.size(); 77 // int cols = array[0].size(); 78 // int i = rows - 1, j = 0;//左下角元素坐标 79 // while (i >= 0 && j<cols) {//使其不超出数组范围 80 // if (target<array[i][j]) 81 // i--;//查找的元素较少,往上找 82 // else if (target>array[i][j]) 83 // j++;//查找元素较大,往右找 84 // else 85 // return true;//找到 86 // } 87 // return false; 88 // } 89 //}; 90 91 92 ////从二维数组中查找数字的函数实现方法1: 93 ////////https://www.nowcoder.com/profile/9734827/codeBookDetail?submissionId=12713594 94 /* 思路 95 * 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增, 96 * 因此从左下角开始查找,当要查找数字比左下角数字大时。右移 97 * 要查找数字比左下角数字小时,上移 98 */ 99 ////////相比较前面,此处使用for循环,而且连续使用3个if,不如上面进一步精简! 100 //class solution 101 //{ 102 //public: 103 // bool Find(int target, vector<vector<int>> array) 104 // { 105 // int nrow = array.size(); 106 // int nclum = array[0].size(); 107 // int i, j; 108 // for (i=nrow-1, j=0; i>=0&&j<=nclum-1;) 109 // { 110 // if (array[i][j] == target) 111 // return true; 112 // if (array[i][j] > target) 113 // { 114 // i--; 115 // continue; 116 // } 117 // if (array[i][j] < target) 118 // { 119 // j++; 120 // continue; 121 // } 122 // } 123 // return false; 124 // } 125 // 126 //}; 127 128 129 //////从二维数组中查找数字的函数实现方法2:每行二分法 130 /////////https://www.nowcoder.com/profile/9734827/codeBookDetail?submissionId=12713594 131 ///*把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是nlogn*/ 132 //class solution 133 //{ 134 //public: 135 // bool Find(int target, vector<vector<int>> array) 136 // { 137 // 138 // for (int i = 0; i<array.size(); i++) 139 // { 140 // int low = 0; 141 // int high = array[i].size() - 1; 142 // while (low <= high) 143 // { 144 // int mid = (low + high) / 2; 145 // if (target>array[i][mid]) 146 // low = mid + 1; 147 // else if (target<array[i][mid]) 148 // high = mid - 1; 149 // else 150 // return true; 151 // } 152 // } 153 // return false; 154 // } 155 //};//类之后需要加个分号 156 157 158 int main() 159 { 160 vector<vector<int>> array_td(5, vector<int> (3)); 161 solution find_num; 162 int num = 0; 163 int i, j; 164 bool exist=false; 165 for (i = 0; i < array_td.size(); i++) 166 { 167 for (j = 0; j < array_td[0].size(); j++) 168 { 169 num++; 170 array_td[i][j] = num; 171 } 172 } 173 exist = find_num.Find(5, array_td); 174 cout << exist << endl; 175 if (exist) 176 { 177 cout << "数字在二维数组中" << endl; 178 } 179 return 0; 180 }
注意:
1、数组的行和列的索引范围:0~行数或列数-1
2、理解二分法查找的思想的更深一层次!不要拘泥于一般形式的二分法:从递增或递减顺序排列,然后二分法!
二分法使用,如果有递增递减字样,查找某一个数
3、注意方法的返回值类型,一定要返回值:布尔型,布尔型变量写法:false true,小写!!!
4、注意判断是否有参数传递过来,要判断!鲁棒性!
5、if……else if……else

浙公网安备 33010602011771号