剑指offer——1.二维数组中的查找

题目描述:

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

解题思路:

二维数组规律是:每行从左到右递增;每列从上到下递增。如下一个例子:

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

本题可从左下角或者右上角开始,例如从右上角开始,使右上角数字与要查找的数字作比较,有三种情况:

  1. 右上角数字与要查找的数字大小相等,则返回true
  2. 右上角数字比要查找的数字大,则说明最右边一列都比目标数字大,则去掉最右一列,向左移动一列
  3. 右上角数字比要查找的数字小,则说明最上面一行都比目标数字小,则去掉最上一行,向下移动一列

按此规律一直移动,如果找到目标数字,则返回true;如果位置超出最左边界或最下边界,则说明无匹配,返回false

参考源码:

#include <iostream>
#include <vector>
using namespace std;
class Solution 
{
public:
	bool Find(int target, vector<vector<int> > array) 
	{
		if (array.size() == 0 || array[0].size() == 0) return false;
		int row = array.size()-1;
		int column = array[0].size()-1;
		int row_move = 0;//移动位置所在的行数
		int column_move = column;//移动位置所在的列数
		while (row_move <= row && column_move >= 0)
		{
			if (array[row_move][column_move] == target)
			{
				return true;
			}
			else if (array[row_move][column_move] > target)
			{
				column_move--;
				//continue;
			}
			else if (array[row_move][column_move] < target)
			{
				row_move++;
				//continue;
			}
		}
		return false;
	}
};

//测试用例
int main()
{
	vector<vector<int>> array;
	vector<int> insert;
	insert.push_back(1);
	insert.push_back(2);
	insert.push_back(8);
	insert.push_back(9);
	array.push_back(insert);
	insert.clear();
	insert.push_back(2);
	insert.push_back(4);
	insert.push_back(9);
	insert.push_back(12);
	array.push_back(insert);
	insert.clear();
	insert.push_back(4);
	insert.push_back(7);
	insert.push_back(10);
	insert.push_back(13);
	array.push_back(insert);
	insert.clear();
	insert.push_back(6);
	insert.push_back(8);
	insert.push_back(11);
	insert.push_back(15);
	array.push_back(insert);
	insert.clear();
	Solution s;
	if (s.Find(11,array))
	{
		cout << "yes" << endl;
	}
	else
	{
		cout << "no" << endl;
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/N1neDing/article/details/81783312