二维数组二分查找

本文介绍了一种使用二分查找算法解决牛客网编程题的方法。通过对矩阵的逐行扫描并应用二分查找,可以高效地找到目标值。文章提供了一个具体的Java实现案例。

牛客网上面练的第一道编程题,,,终于有次百分之百通过了。。。


思路:
一个 for 循环,每一行用个二分查找,因为题目中数组是有效的,所以很容易的就朝二分走了
public class Solution {
     public boolean Find( int target, int [][] array) {
          boolean result= false ;
         int row = array.length;
         int lie = array[array.length- 1 ].length;
        if (lie== 0 ){
             result = false ;
         } else {
         for ( int i= 0 ;i<row;i++) {
             int right = 0 ;
             int left = lie - 1 ;
             System.out.println( "i=" + i);
             if (result = search(right, left, i, array, target)) {
                 break ;
             }
         }
         }
         return result;
     }
      public boolean search( int right, int left, int i, int [][] array, int target){
         int mid = (right+left)/ 2 ;
         boolean result = false ;
         if (array[i][mid]==target){
             result = true ;
         } else if (array[i][mid]>target && right<left){
             left = mid - 1 ;
             result = search(right,left,i,array,target);
         } else if (array[i][mid]<target && right<left){
             right = mid + 1 ;
             result = search(right,left,i,array,target);
         }
         return result;
     }
}

在C++中,二分查找通常用于一维有序数组,但对于二维数组,由于它是矩阵形式的数据结构,我们一般不会直接应用二分查找。因为二分查找依赖于元素的线性排列,而二维数组的索引通常是行优先(i, j)或列优先(j, i)。不过,如果你有一个预处理好的二维有序数组,并且想要查找特定值对应的位置,可以将其视为一维化后进行操作。 以下是一个简单的例子,假设我们要在一维化后的二维数组上进行二分查找: ```cpp #include <vector> #include <iostream> // 二维数组转换为一维 std::pair<int, int> flatten(const std::vector<std::vector<int>>& matrix, int value) { std::vector<int> flat; for (const auto& row : matrix) { for (int elem : row) { if (elem == value) { // 记录下元素所在的原始位置 return {flat.size(), row.size() - 1}; } flat.push_back(elem); } } // 如果没找到,返回{-1, -1} return {-1, -1}; } // 二分查找辅助函数 bool binarySearch(int* arr, int left, int right, int target) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return true; else if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return false; } // 使用上述函数进行查找 int main() { std::vector<std::vector<int>> matrix = {{1, 3, 5}, {7, 9, 11}, {13, 15, 17}}; int value = 9; std::pair<int, int> result = flatten(matrix, value); if (result.first != -1) { std::cout << "找到了元素,它在原数组中的位置是(" << result.first << ", " << result.second << ")\n"; int row = result.first; int col = result.second; bool found = binarySearch(matrix[row].data(), 0, col, value); // 注意数据类型匹配 if (found) { std::cout << "并且在一维化后的数组中位于索引" << binarySearchResult << "\n"; } else { std::cout << "但在一维化后的数组中未找到\n"; } } else { std::cout << "元素不在数组中\n"; } return 0; } ``` 在这个例子中,`flatten` 函数将二维数组转换为一维,然后 `binarySearch` 用于在一个已排序的一维数组中查找目标值。注意,在二维数组的每个子数组中查找时,需要处理指针和索引的问题,例如 `matrix[row].data()` 用于获取子数组的首地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值