数组和矩阵问题:在行列都排好序的矩阵中找数

题目

  给定一个有 N*M 的整型矩阵 matrix 和一个整数 K,matrix 的每一行和每一列都是排好序的。实现一个函数,判断 K 是否在 matrix 中。

  例如:

  0  1  2  5

  2  3  4  7

  4  4  4  8

  5  7  7  9

  如果 K 为 7,返回 true; 如果 K 为 6,返回 false。

要求

  时间复杂度为 O(M+N), 额外空间复杂度为 O(1)。

难度

  一星

解答

  注意到该矩阵行列都是排好序的,可以从右上角或者左下角开始与K进行比较。

  下面说明从右上角的数开始寻找的方法:

  1. 从矩阵右上角的数开始寻找(row=0, col=M-1),注意到 matrix[row][col] 左边的数都小于等于 matrix[row][col],下边的数都大于等于 matrix[row][col]。

  2. 比较当前数 matrix[row][col] 与 K 的关系:

  • 如果与 K 相等,说明已被找到,直接返回 true;
  • 如果大于 K,说明 K 有可能在 matrix[row][col] 的左边,令 col = col-1, 重复步骤2;
  • 如果小于 K,说明 K 有可能在 matrix[row][col] 的下边,令 row = row+1,重复步骤2;

  3. 如果找到越界都没有发现与 K 相等的数,则返回 false.

 1 public class Main {
 2     public static void main(String[] args) {
 3         int[][] matrix = {{0,1,2,5},{2,3,4,7},{4,4,4,8},{5,7,7,9}};
 4         System.out.println(new Main().isContains(matrix, 7)); //true
 5         System.out.println(new Main().isContains(matrix, 6)); //false
 6     }
 7     
 8     public boolean isContains(int[][] matrix, int K){
 9         //从右上角的数开始与 K 进行比较
10         int row = 0;
11         int col = matrix[0].length - 1;
12         while(row < matrix.length && col > -1){
13             if(matrix[row][col] == K){ //若找到与 K相等的数直接返回 true
14                 return true;
15             }else if(matrix[row][col] > K){ //若大于K, 则K有可能在 matrix[row][col] 的左边
16                 col--;
17             }else{ //若大于K, 则K有可能在 matrix[row][col] 的下边
18                 row++;
19             }
20         }
21         return false;
22     }
23 }

   从左下角的数(row=N-1, col=0)开始寻找的方法与上述类似,注意到 matrix[row][col] 上边的数都小于等于 matrix[row][col],右边的数都大于等于 matrix[row][col]。具体代码可自行实现。

  

转载于:https://www.cnblogs.com/zlxyt/p/10522238.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值