在行列都排好序的矩阵中找指定的数
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; } }

浙公网安备 33010602011771号