LeetCode Search a 2D Matrix

本文介绍了一种高效的矩阵搜索算法,用于在一特殊排序的二维矩阵中查找特定值。该矩阵的每行从左到右递增排序,且每行的首个元素大于前一行的末尾元素。文章详细阐述了算法思路及实现代码。

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

题目:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

Given target = 3, return true.

题意:

给定一个m * n的矩阵,然后给定一个需要判断是否在这个矩阵中的值,其中这个矩阵有如下特点,每一行都是已经排好序的,并且每一行的第一个元素都比下一行的第一个元素要小,判断给定的这个值是否在这个矩阵中。

我的思路是这样的,首先是按行找,找到需要找的那个值在一行,其中这里需要考虑好几种情况,首先是如果这个矩阵只有一行,并且这个值比第一行的第一个元素都要小,那么就直接返回false;如果这个值找到的行在最后一行,那么直接就返回这一行的行号即可。找到具体在哪一行之后,就可以调用二分搜索来查找具体这个值是否存在。

代码:

<span style="font-size:14px;">public class Solution 
{
    public boolean searchMatrix(int[][] matrix,int target)
	{
		int rowlength = matrix.length;
		System.out.println(rowlength);
		int collength = matrix[0].length;
		int flag = -1;
		for(int i = 0; i < rowlength; i++)
		{
			if(matrix[i][0] == target)
			   return true;
			if(matrix[i][0] > target && i == 0)
			   return false;
			if(i < rowlength - 1 && matrix[i][0] < target && matrix[i + 1][0] > target)
			{
			    flag = i;
			    break;
			}
			if(matrix[i][0] <target && i == rowlength - 1)
			{
			    flag = i;
			    break;
			}
		}
		System.out.println(flag);
		if(flag != -1)
		{
			return binarySearch(matrix[flag],0,collength - 1,target);
		}
		return false;
	}
	public boolean binarySearch(int[] nums,int start,int end,int target)
	{
		if(start <= end)
		{
			int middle = (start + end) / 2;
			int middleValue = nums[middle];
			if(target == middleValue)
				return true;
			else if(target < middleValue)
				return binarySearch(nums,start,middle - 1,target);
			else if(target > middleValue)
				return binarySearch(nums,middle + 1,end,target);
		}
		return false;
	}
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值