借阅

题目描述

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

解题思路

       根据题意,我们知道,这是一个从左到右增大,从上到下增大的数组。所以,我们可以选取二维数组的右上角左下角作为比较的起点。

       所以,有两种解题方法。
       设在二维数组<i,j>位置的值为array[i][j],要找的整数为target。
       第一种,选取二维数组的右上角作为比较的起点。

       如果array[i][j]>target,说明大了,所以需要往左走,让array[i][j]变小,即i--;
       如果array[i][j]<target,说明小了,所以需要往下走,让array[i][j]变大,即j++;
       如果array[i][j]== target,说明找到了,返回true;

       如果还是找不到,返回false;

       第二种,选取二维数组的左下角作为比较的起点。

       如果array[i][j]>target,说明大了,所以需要往上走,让array[i][j]变小,即j--;
       如果array[i][j]<target,说明小了,所以需要往右走,让array[i][j]变大,即i++;
       如果array[i][j]== target,说明找到了,返回true;

       如果还是找不到,返回false;

代码

[java]  view plain  copy
  1. public class Solution {  
  2.     public boolean Find(int target, int [][] array) {  
  3.         //第一种解法,从右上角开始比较  
  4.         int colLength = array[0].length;     //列数  
  5.     int row = 0, column = colLength-1;                    //i,j表示起始比较点位于右上角  
  6.     for(;row < colLength && column >= 0;) {  
  7.         if (target == array[row][column]) return true;  
  8.         else if (target > array[row][column]) row++;  //往下走  
  9.         else column--;                                //往左走  
  10.     }  
  11.     return false;  
  12.     }  
  13. }  

[java]  view plain  copy
  1. public class Solution {  
  2.     public boolean Find(int target, int [][] array) {  
  3.         //第二种解法,从左下角开始比较  
  4.         int rowLength = array.length;    //行数               
  5.     int row = rowLength-1, column = 0;                     //i,j表示起始比较点位于左下角  
  6.     for(;row >= 0 && column < array[0].length;) {  
  7.         if (target == array[row][column]) return true//找到了  
  8.         else if (target > array[row][column]) column++;//往右走  
  9.         else row--;                                    //往上走  
  10.     }  
  11.     return false//没找到  
  12.     }  
  13. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值