在二维数组的查找

来源:互联网 发布:韩语视频翻译软件 编辑:程序博客网 时间:2024/05/17 07:30

这里写图片描述

/*    法一:直接暴力:O(MN)  从上到下从左到右搜一遍bool Find(vector<vector<int> > array,int target) {      for(int i=0; i<array.size(); i++){              for (int j=0; j<array[i].size(); j++){                  if(array[i][j] == target)  return true;     }    }    return false;}
法二:因为数组从左到右递增,从上到下递增,所以从左下角来看,      从左到右递增,从下到上递减。在搜索时,当前元素比target大时,指针向右移动;      当前元素比target小时,指针向上移动;相等时输出true.     最坏时间复杂度:O(M+N),N×M的矩阵*/bool Find(vector<vector<int> > array,int target) {    int i = array.size() - 1;    int j = 0;    //从左下角开始搜索    while (i>=0 && j<array[i].size()){        if (array[i][j] == target){            return true;        }else if (array[i][j] < target){            j++;        }else{            i--;        }    }    return false;}
/*    法三:因为每一行都有序,所以对每一行都执行二分查找:O(NlogM),N×M的矩阵*/  bool Find(vector<vector<int> > array,int target) {     for (int i=0; i<(int)array.size(); i++){            int low = 0;            int high = array[i].size();            int mid = (low+high)/2;            while (low < high){                if (target == array[i][mid]){                    return true;                }                if (target<array[i][mid]){                    high = mid;                }else{                    low = mid + 1;                }                mid = (low + high)/2;            }        }//for        return false;}
/*    法四:二分  http://justjavac.iteye.com/blog/1310178*/ int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2){        int begin_m1 = m1, begin_n1 = n1, end_m2 = m2, end_n2 = n2;        int left_result = 0,  right_result = 0;        int i = (m1+m2)/2, j = (n1+n2)/2;        if (a == NULL)                return 0;        if (value < *(a+m1*n+n1) || value > *(a+m2*n+n2))                return 0;        else if (value == *(a+m1*n+n1) || value == *(a+m2*n+n2))                return 1;        while ((i!=m1 || j!=n1) && (i!=m2 || j!=n2)){                 if ( value == *(a+i*n+j) )                         return 1;                 else if ( value < *(a+i*n+j) ){                         m2 = i;                         n2 = j;                         i = (i+m1)/2;                         j = (j+n1)/2;                  }                 else{                         m1 = i;                         n1 = j;                         i = (i+m2)/2;                         j = (j+n2)/2;                 }           }           //search left & right           if ( i<end_m2 )                   left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);           if ( j<end_n2 )                   right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);           if (left_result | right_result )                   return 1;           else                   return 0;}
1 0