在行列都排好序的矩阵中找指定的数

1:题目描述

题目描述

给定一个N \times MN×M的整形矩阵matrix和一个整数K, matrix的每一行和每一列都是排好序的。
实现一个函数,判断K是否在matrix中
[要求]
时间复杂度为O(N+M)O(N+M),额外空间复杂度为O(1)O(1)。

输入描述:

第一行有三个整数N, M, K
接下来N行,每行M个整数为输入的矩阵

输出描述:

若K存在于矩阵中输出"Yes",否则输出"No"
示例1

输入

2 4 5
1 2 3 4
2 4 5 6

输出

Yes
示例2

输入

2 4 233
1 2 3 4
2 4 5 6

输出

No 

2:题目分析

  题目要求时间复杂度为O(m+n),空间复杂度为O(1),所以不能遍历二维数组方法,因为这种时间复杂度是O(m*n),并且浪费了每一行,每一列都是有序序列的性质。但是如何利用该性质尼?如果从左上角开始进行查找,假设当前数值大于目标值k,那么真正的位置可能再当前位置的右侧,或者下面,不能确定。但是如果从左下角出发尼?我们就可以确定只要当前值大于目标值k,则应该给继续再上面寻找,如果小于目标值k,则应该再右面寻找!!!

3:代码示例

package No1;

import java.lang.reflect.AnnotatedArrayType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author :dazhu
 * @date :Created in 2020/3/24 12:14
 * @description:在行列都排好序的矩阵中找指定的数
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[] args){
        int[][] array;
        int k ;
        int m;
        int n;
        Scanner sc = new Scanner(System.in);
        //获取,m,n,k的值
        m = sc.nextInt();
        n = sc.nextInt();
        k = sc.nextInt();
        array = new int[m][n];
        //获取二维数组
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                array[i][j] = sc.nextInt();
            }
        }

        System.out.println(solution(array,m,n,k)? "Yes":"No" );
    }

    //从特殊到一般的思想如下:
    //{1,3,7}
    //{4,6,8}
    //{5,9,10}
    //如果目标是6如何找到呢?
    //我们从左下角开始搜索,如果目标值k大于当前值,则向右侧继续搜索,
    //如果小于当前值,则将上继续搜索,不断重复直到找到目标值k为止。
    public static boolean solution(int[][]array,int m,int n,int k){
        //从二维数组左下角开始寻找
        int a = m-1;
        int b = 0;
       
for(int i=0;i<m+n;i++){ //如果当前位置超过了二维数组地范围,直接return false; if(a>m-1||a<0||b>n-1||b<0){ return false; } //如果当前即为目标值。return true if(array[a][b]==k){ return true; } else{ //如果当前值大于k,则应该向上寻找 if(array[a][b]>k){ a--; } else{ //如果当前值小于k,则应该向右寻找 b++; } } } return false; } }

 

posted @ 2020-03-24 18:43  大朱123  阅读(412)  评论(0)    收藏  举报