Cracking the coding interview--Q9.6

针对每行每列都有序的矩阵,设计一个O(m+n)时间复杂度的搜索算法。从矩阵的角部元素开始,根据元素与目标值的比较排除部分区域,逐步缩小查找范围,直至找到目标元素或确定其不存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:

Given a matrix in which each row and each column is sorted, write a method to find an element in it.

译文:

给出一个矩阵,其中每一行和每一列都是有序的,写一个函数在矩阵中找出指定的数。


矩阵是有序的,因此要利用这一点,当矩阵中元素和要查找的元素对比后, 如果相等,我们返回下标;如果不等,我们就排除掉一些元素,而不仅仅是对比的元素。 我们从矩阵的四个角的元素入手看看,有什么特点。左上角是最小的, 因为矩阵向右是递增的,向下也是递增的。同理,右下角是最大的。让我们来看看右上角, 设要查找的元素为x,比如x比右上角元素5大,那么它也会比第一行的其它元素都大。 因此可以去掉第一行;如果它比右上角元素小,那么它也会比最后一列的元素都小, 因此可以去掉最后一列;然后这样不断地比下去,只需要O(m+n)的时间就查找完。 对于左下角的元素,也有一样的特点。就不再分析了。


package chapter_9_SortingandSearching;

import java.util.Scanner;

/**
 * 
 * 给出一个矩阵,其中每一行和每一列都是有序的,写一个函数在矩阵中找出指定的数。
 * 
 */
public class Question_9_6 {
	
	/**
	 * @param array
	 * @param find
	 * @return
	 * 
	 * 可以从右上角开始查找,右上角数组是所在行最大,所在列最小
	 * 如果等于,则直接找到返回。
	 * 如果小于右上角数字,则当前最后一列可以排除。因为最后一列从上向下递增
	 * 如果大于右上角数字,则当前第一行可以排除。因为第一行左往右递增。
	 * 
	 */
	public static int findIndex(int array[][], int find) {
		int row = 0;
		int col = array[0].length -1;
		while(row < array.length && col >= 0) {
			if(array[row][col] > find) {
				col --;
			} else if(array[row][col] < find) {
				row ++;
			} else {
				return row * array[0].length + col;
			}
		}
		return -1;
	}
	
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		int row = scanner.nextInt();
		int col = scanner.nextInt();
		int array[][] = new int[row][col];
		
		scanner.nextLine();
		for(int i=0; i< row; i++) {
			for(int j=0; j<col; j++) {
				array[i][j] = scanner.nextInt();
			}
			scanner.nextLine();
		}
		
		int find = scanner.nextInt();
		int index = findIndex(array, find);
		
		System.out.println("index x:" + index/array[0].length + " y:" + index%array[0].length);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值