leetcode 虐我篇之(二) Two Sum

正所謂有了第一次被虐,就會有第二次。今天,實驗室只有我一個人,因爲是暑假,大家不是去實習就是回家之類的。剩下我一個人在做導師和一個公司合作的項目。今天週六所以給自己放個假(前幾周都是沒有周六日,天天去公司幹,要死的節奏啊)。看了《爸爸去哪兒》和《中國好聲音》放鬆了一下,然後就弄了一下sae和svn管理。接着就到leetcode網站上看一下題目。第一次做了最上面的題目,這次我就拉到最後,做最後一題,題目是Two Sum

題目的意思也很清楚明白,就是從一個數組中找出兩個數,這兩個數的和要等於一個目標數,返回這兩個數在原來數組中的座標。我一開始的想法是,直接就兩個for循環遍歷一下就ok啦。接着就開始寫了。

代碼如下(注意後面提交發現是錯誤的):

vector<int> twoSum(vector<int> &numbers, int target) 
{
	//foreach the vector to find two numbers
	vector<int> result;
	vector<int>::size_type index1,index2,size;
	size = numbers.size();

	bool find = false;

	for (index1 = 0;index1 != size; ++index1)
	{
		for(index2 = index1 + 1;index2 != size; ++index2)
		{
			if ( numbers[index1] + numbers[index2] == target)
			{
				find = true;
				break;
			}
		}

		if (find)
		{
			break;
		}
	}

	if (find)
	{
		result.push_back(index1+1);
		result.push_back(index2+1);
	}

	return result;
}

後面一提交,就報錯了。是一個超時錯誤,什麼time limited之類的。還舉了個超長的數組例子。怎麼原來還需要考慮時間複雜度?!好吧,讓我再想想。怪不得通過率只有十幾。

然後我想,要提高時間,那就先排序唄,排完序再找,如果加起來數大了,就退出內層循環,這樣就省下很多時間啦。但是,如果直接對vector排序的話,那之前的index不就打亂了嗎?怎麼才能找回對應的呢?然後就想着找另外一個vector<int> index裝現在這個numbers的下標,對numbers排序的同時要更新index下標,這樣就能夠在知道原來index的前提下找出這兩個數了。接着就是排序的問題,用什麼方法排序呢?冒泡?直接排序?插入排序?堆排序?還是?因爲我想着剛纔都超時了,現在是不是應該找一個時間複雜度小一點的,然後又想是穩定的(現在想想,好像不穩定的也沒關係吧),最後就選歸併排序了。在提交後發現又有一個問題,就是要第一個下標要小於第二個下標,唉,沒審好題目。改過後提交,Accepted!

修改後的代碼如下:

#include <vector>
#define INF 65535;  //表示int 的無窮
using namespace std;

//針對是vector<int>的情況
/////////////合併排序////////////////////////
void merge2vector(vector<int> &Array,vector<int> &Array2,int p,int q,int r)
{
	int n1=q-p+1;
	int n2=r-q;
	int *L=new  int[n1+1];	//動態數組
	int *R=new  int[n1+1];
	int *L2=new  int[n1+1];	//動態數組
	int *R2=new  int[n1+1];
	int i=0,j=0;
	for (i=0;i<n1;i++)
	{
		L[i] = Array[p+i];
		L2[i] = Array2[p+i];
	}

	for (j=0;j<n2;j++)
	{
		R[j] = Array[q+j+1];
		R2[j] = Array2[q+j+1];
	}

	L[n1]=INF;
	R[n2]=INF;
	L2[n1]=INF;
	R2[n2]=INF;
	i=0;
	j=0;
	for (int k=p;k<=r;k++)
	{
		if (L[i]<=R[j])
		{
			Array[k]=L[i];
			Array2[k]=L2[i];
			i++;
		} 
		else
		{
			Array[k]=R[j];
			Array2[k]=R2[j];
			j++;
		}
	}

	delete[] L;
	delete[] L2;
	delete[] R;
	delete[] R2;
}

void mergeSort2vector(vector<int> &Array,vector<int> &Array2,int p,int r)
{
	if (p<r)
	{
		int q=(p+r)/2;
		mergeSort2vector(Array,Array2,p,q);
		mergeSort2vector(Array,Array2,q+1,r);
		merge2vector(Array,Array2,p,q,r);
	}
}


vector<int> twoSum(vector<int> &numbers, int target) 
{
	//先用歸併排序
	vector<int> result;
	vector<int>::size_type ind,index1,index2,size;
	size = numbers.size();

	if (size <= 0 )
	{
		return result;
	}

	//下標容器
	vector<int> index;
	for (ind = 0;ind < size;ind++)
	{
		index.push_back(ind+1);
	}

	//開始歸併排序
	mergeSort2vector(numbers,index,0,size-1);

	//排序完畢,開始遍歷查找


	bool find = false;

	for (index1 = 0;index1 != size; ++index1)
	{
		for(index2 = index1 + 1;index2 != size; ++index2)
		{
			if ( numbers[index1] + numbers[index2] == target)
			{
				find = true;
				break;
			}
			else if ( numbers[index1] + numbers[index2] > target)
			{
				break;
			}
		}

		if (find)
		{
			break;
		}
	}

	if (find)
	{
		int temp = index[index1];
		if (index[index1] > index[index2])
		{
			index[index1] = index[index2];
			index[index2] = temp;
		}
		result.push_back(index[index1]);
		result.push_back(index[index2]);
	}

	return result;
}
總覺得這道題是不是有其他簡便的方法呢。唉,喉嚨痛感冒頭暈中,暫時不想了。準備睡覺。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章