二维数组中的查找:剑指Offer

3 篇文章 0 订阅
3 篇文章 0 订阅

题目描述:

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

时间限制:1秒   空间限制:32768K


简单方法:二维数组遍历

二维数组遍历:python版本

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        for rows in array:  
            for i in rows:
                if target == i:
                    return True
        return False

满足要求

二维数组遍历:java版本

public class Solution {    
	public boolean Find(int target, int [][] array) { //返回boolean类型        
		boolean result = false;                       //事先创建boolean类型变量        
		for(int i = 0 ;i < array.length; i++){        //外层控制列数            
			for(int j = 0; j < array[i].length; j++){ //内层控制行数                
				if( target == array[i][j]){                   
					result = true;                    //注意不能在此处return,作为小白的我搞了很久   
					break;              
					}         
			}        
		}        
		return result;    
		}				
}

满足要求

二维数组遍历:c++版本

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        bool result = false;
              if (array.empty()){
                  cout << "The vector is empty!" << endl;
                  return false;
                }
             int i,j;
             for (i = 0; i < array.size(); i++){
               for (j = 0; j < array[0].size(); j++){
                  if (target == array[i][j]){
                     result = true;
                     break;
            } 
              }
                } 
          return result;
    }
};

很快

思路2:因为数组从上到下递增,从左到右递增,所以从左下角找(i,j分别代表行、列)

如果target大,则往右找 j++

如果target小,则往上找 i--

思路2:java版

/*
 * 思路2:数组从上到下递增,从左到右递增,所以从左下角找
 * 如果target大,则往右找j++
 * 如果target小,则往上找i--
 */
 
public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;            //数组行数
        int columns = array[0].length;      //数组列数
        int i,j;                      		//i表示行数,j表示列数
        for ( i = rows-1,j = 0 ;  i>=0 && j < columns ; ) { // 不能 i<0 || j>= columns 
            if (target == array[i][j]){
               return true;					//为什么这里又可以在if里 return ??
            } else if (target < array[i][j]) {
                i--;
                continue;
            } else if (target > array[i][j]) {
                j++;
                continue;
            }
        }
        return false;
    }
}

差不多与二维数组遍历一样性能

思路2:C++版

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
         /*二维数组的行数和列数*/
        int rowCount = array.size();
        int colCount = array[0].size();
 
        int i, j;//i指定行的变化,j指定列的变化
        //循环
        for (i = rowCount - 1, j = 0; i >= 0 && j<colCount;)
        {
            if (target == array[i][j])
                return true;
 
            if (target<array[i][j])
            {
                i--;
                continue;
            }
 
            if (target>array[i][j])
            {
                j++;
                continue;
            }
        }
        return false;
    }
};
 反而比数组遍历方法慢了一点。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值