剑指Offer每日一刷 -2017年11月10日

来源:互联网 发布:windows已遇到关键问题 编辑:程序博客网 时间:2024/06/05 21:52

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

二维数组的行数:array.length;

二维数组的列数:array[0].length;

两种思路:

思路一:把每一行看成一个有序的递增数组,对每一行进行二分查找。

注:

二分查找:二分查找是一个基础的算法。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。

算法要求:必须采用按照关键字进行顺序存储。

public class BinarySearch {    public boolean Find(int [][] array,int target) {                 for(int i=0;i<array.length;i++){            int low=0;            int high=array[i].length-1;            while(low<=high){                int mid=(low+high)/2;                if(target>array[i][mid])                    low=mid+1;                else if(target<array[i][mid])                    high=mid-1;                else                    return true;            }        }        return false;     }}

另外一个思路是:

利用题目中二维数组的性质:

由上到下,由左到右递增的规律,选取右上角或者左下角的元素array[0][col-1]或array[row-1][0],

右上角时:当target小于array[row][col]时,那么target必定在该行,且在该元素的左边,col--;

当target大于array[row][col]时,那么target元素在该行下面的某行中,row++.

public boolean Find(int target,int[][] array){int row = 0;int col = array[0].length-1;while(row < array.length && col >=0){if(target == array[row][col]){return true;}else if(target > array[row][col]){row++;}else{col--;}}return false;}

左下角时:当target 大于array[row][col]时,那么target必定在该行,且在该元素的右边,col++;

当target小于arry[row][col]时,那么target在该行的上面,row--;

实现思路与上同,程序略。

原创粉丝点击