leetcode240. 搜索二维矩阵 II(java实现,最简洁最易懂的代码)

这里是引用

解题思路(一)

** 其实我觉得如果在项目中遇到这个题型的话,先创建一个String类的对象,然后将matrix传进去,接着调用String.contains(target)方法就行了。哈哈哈哈~~~~~~,好了,下面进入正题,笨方法就是把二维数组变成一维数组,然后再排序,接着用二分查找法找到目标元素。但是这个方法好像在leetcode上执行代码时候正确,但是提交的时间会出发超出时间时间限制。。。。因为这个笨方法的时间复杂度达到了O(n²),或许领扣允许最大的时间复杂度为O(1)吧,具体看代码!
**

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix.length==0){
            return false;
        }
     int[] newmatrix=new int[matrix.length*matrix[0].length];//创建一维数组
        int k=0;
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                newmatrix[k]=matrix[i][j];//将二维数组的值传给一维数组
                k++;
           }
        }
        Arrays.sort(newmatrix);
        int first=0;
        int last=newmatrix.length-1;
        int mid=0;
        while(first<=last){//二分查找
            mid=(first+last)/2;
            if(newmatrix[mid]<target){
                first=mid+1;
            }
            else if(newmatrix[mid]>target){
                last=mid-1;
            }            
            else{
                return true;
            }
        }
        return false;
    }

关于为什么会想到笨方法呢。。。因为我刚做这道题的时候发现我折半查找法居然给忘了!没错,真的是忘了,我佛了。具体看代码的运行结果吧,其实可以在Eclipse上试一试。

在这里插入图片描述

提交的时候就。。。。。。

在这里插入图片描述

接下来是第二种方法。

解题思路

其实做这种二维数组找元素的题是有套路的。。。找对角元素切入,无非就是左上、左下、右上和右下这几个元素。我们发现左上和右下这两个元素它们的两个方法的数不是全增就是全减,所以这两个数不灵活,我们就不要从这两个方法开始,我们要找的这个出发点,它的两个方法,必须一个是递增一个是递减。那我们就从左下或者右上这两个方法出发吧。我暂且从左下出发。具体看代码实现。

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix.length==0){
            return false;
        }
        //从18这个元素出发
        int row=matrix.length;
        int col=matrix[0].length;
        //定义x横向变量和y纵向变量。
        int x=row-1;
        int y=0;
        /*
        循环继续条件
        */
        while(x>=0&&y<col){
            if(target==matrix[x][y]){
                return true;
            }else if(target>matrix[x][y]){
                y++;
            }else{
                x--;
            }
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值