class Solution { public: // 看题意似乎是正方形 no 可能是矩形 而且可能有重复元素! /** * 二分搜索 基本函数 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int binary_search(vector<int>& nums, int target) { // write code here int n = nums.size(); int l = 0, r = n-1; int ans = -1; while (l<=r) // 终止条件注意! { int m = l+0.5*(r-l); // 0.5*(r+l) 注意这两个取中值都可以 不要混淆就行! if(nums[m]>target) { r = m - 1; } else if(nums[m]<target) { l = m+1; } else // 一定得保留此支路! { ans = m; break; } } return ans>=0 ? ans : -1; } // 双二分查找 递归 ! bool double_binary(vector<vector<int> >& nums, int target, int xl, int yl, int xr, int yr) { // 搜索范围由 (xl, yl) (xr, yr) 分别为左上 和 右下圈出的矩形 if(xl>xr || yl>yr) // 类比二分搜索的终止条件 return false; int xm = 0.5*(xr+xl); int ym = 0.5*(yr+yl); if(nums[xm][ym]==target) return true; if(nums[xm][ym]>target) // 分块 但注意各块不再规则 而且分块方式有两种 { if(double_binary(nums, target, xl, yl, xm-1, yr )) return true; if(double_binary(nums, target, xm, yl, xr, ym-1)) return true; } else { if(double_binary(nums, target, xm+1, yl, xr, yr )) return true; if(double_binary(nums, target, xl, ym+1, xm, yr)) return true; } return false; //别忘了 } // 解法四 递归 二分搜索 利用每一行/列 递增的性质 O(logm logn) ! bool Find(int target, vector<vector<int> > array) { int m = array.size(), n = array[0].size(); bool ans = double_binary(array, target, 0, 0, m-1, n-1); return ans; } };