二维数组中的寻找

题目描述

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

思路
* 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,
* 因此从左下角开始查找,当要查找数字比左下角数字大时。右移
* 要查找数字比左下角数字小时,上移

java代码实现

public class Solution {
    public boolean Find(int target, int [][] array) {
           int i =array.length-1;
           int j =0;
        while(i>=0&&j<array[0].length){
            
         if(target<array[i][j]){
             i--;
         }else if(target>array[i][j]){
             j++;
         }else{
             return true;
         }
        }
	return false;
       
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设峰值定义为在数组找到一个元素,其左右上下四个元素都小于它,则可以采用以下方法在二维数组寻找峰值: 1. 遍历数组的第一行,找到该行的最大值及其所在的列号,记为max_col。 2. 在第max_col列,找到该列的最大值及其所在的行号,记为max_row。 3. 判断max_row行max_col列的元素是否为峰值,如果不是,则比较该元素与其上下左右四个元素的大小,移动到更大的元素所在的位置,重复步骤3。 4. 如果max_row行max_col列的元素是峰值,则返回该元素。 代码示例(Python): ``` def find_peak(matrix): rows, cols = len(matrix), len(matrix[0]) max_col = 0 for j in range(cols): if matrix[0][j] > matrix[0][max_col]: max_col = j max_row = 0 for i in range(rows): if matrix[i][max_col] > matrix[max_row][max_col]: max_row = i if (max_row == 0 or matrix[max_row - 1][max_col] <= matrix[max_row][max_col]) and \ (max_row == rows - 1 or matrix[max_row + 1][max_col] <= matrix[max_row][max_col]) and \ (max_col == 0 or matrix[max_row][max_col - 1] <= matrix[max_row][max_col]) and \ (max_col == cols - 1 or matrix[max_row][max_col + 1] <= matrix[max_row][max_col]): return matrix[max_row][max_col] elif max_row > 0 and matrix[max_row - 1][max_col] > matrix[max_row][max_col]: return find_peak(matrix[:max_row, :]) elif max_row < rows - 1 and matrix[max_row + 1][max_col] > matrix[max_row][max_col]: return find_peak(matrix[max_row + 1:, :]) elif max_col > 0 and matrix[max_row][max_col - 1] > matrix[max_row][max_col]: return find_peak(matrix[:, :max_col]) else: return find_peak(matrix[:, max_col + 1:]) ``` 该代码采用了递归的方式,在每次比较缩小数组的范围,直到找到峰值为止。时间复杂度为O(mlogn),其m和n分别为数组的行数和列数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值