1. 程式人生 > >劍指offer(1)二維陣列中的查詢

劍指offer(1)二維陣列中的查詢

題目描述
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

解題思路
方法一 最最最簡單的,直接便利全部元素,有相同的就返回true,沒有就返回false
缺點就是太費時間了
程式碼如下

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        for(int i=0;i<array.size();i++)
        {
                for(int j=0;j<(array[0].size());j++)
                {
                    if(array[i][j]==target)
                    {return true;}
                }
        }
        return false;
    }
};

方法二 既然該陣列說了,每行的最後一個是最大的,每列的最後一個是最大的,那麼可以簡化一部分流程,先使目標數值與每行的最後一個比較,如果要是小的話,就證明本行內沒有相同的資料,如果要是大於等於的話,證明該行記憶體在存在該數值的可能,從這一行開始進行查詢,可以直接從該行進行全部查詢,也可以接下來判斷列,程式碼如下

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
	int a = 0, b = 0;
	for (int ii = 0; ii<array.size(); ii++)
	{
		if (target <= array[ii][array[0].size() - 1])
		{
			a = ii;
			break;
		}
	}
	for (int iii = 0; iii<array[0].size(); iii++)
	{
		if (target <= array[array.size() - 1][iii])
		{
			b = iii;
			break;
		}
	}
	for (int i = a; i<array.size(); i++)
	{
		for (int j = b; j<(array[0].size()); j++)
		{
			if (array[i][j] == target)
			{
				return true;
			}
		}
	}
	return false;
    }
};

fxxk!這個程式碼 不知道為什麼顯示您的程式發生段錯誤,可能是陣列越界,堆疊溢位(比如,遞迴呼叫層數太多)等情況引起
百度了一下段錯誤的定義
所謂的段錯誤 就是指訪問的記憶體超出了系統所給這個程式的記憶體空間
大概是超出了程式的記憶體空間大小。這道題要求記憶體空間為32768K