剑指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 }
View Code

注意:

1、数组的行和列的索引范围:0~行数或列数-1 

2、理解二分法查找的思想的更深一层次!不要拘泥于一般形式的二分法:从递增或递减顺序排列,然后二分法!

二分法使用,如果有递增递减字样,查找某一个数

3、注意方法的返回值类型,一定要返回值:布尔型,布尔型变量写法:false true,小写!!!

4、注意判断是否有参数传递过来,要判断!鲁棒性!

5、if……else if……else

posted @ 2018-08-28 14:53  BreakofDawn  阅读(149)  评论(0)    收藏  举报