正所謂有了第一次被虐,就會有第二次。今天,實驗室只有我一個人,因爲是暑假,大家不是去實習就是回家之類的。剩下我一個人在做導師和一個公司合作的項目。今天週六所以給自己放個假(前幾周都是沒有周六日,天天去公司幹,要死的節奏啊)。看了《爸爸去哪兒》和《中國好聲音》放鬆了一下,然後就弄了一下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;
}
總覺得這道題是不是有其他簡便的方法呢。唉,喉嚨痛感冒頭暈中,暫時不想了。準備睡覺。