1. 程式人生 > >算法(10)Subarray Sum Equals K

算法(10)Subarray Sum Equals K

超時 namespace 公司 mes style als += fas 架構

題目:在數組中找到一個子數組,讓子數組的和是k。

思路:先發發牢騷,這兩天做題是卡到不行哇,前一個題折騰了三天,這個題上午又被卡住,一氣之下,中午睡覺,下午去了趟公司,竟然把namespace和cgroup的架構給搞懂了!所以晚上再來攻克這個問題!上午的做法是這樣的,設置一個fast指針,一個slow指針,當【slow,fast】中的值大於k的時候,fast++,反之slow++,這種錯誤的解法誤以為數組是有序的,所以是行不通的,那麽這道題的解法是什麽呢?然後寫了下O(n^3)的解法,果不其然,計算超時!!!沒辦法,只能查資料啦!

真正被接收的答案真是讓人始料未及:

int sum = 0;
int n = nums.size();
map<int,int> m;
int res = 0;

for (int i = 0; i < n; i++) {
m[sum]++;
sum += nums[i];
res += m[sum-k];
}
return res;
map是做啥的啊,以【1,1,1】為例吧,第一輪

m[0]=1, sum=1 res=m[1-2=-1]=0;

m[1]=1, sum=1+1=2 res=m[2-2=0]=1;

m[2]=1, sum=2+1=3 res+=m[3-2=1]=1+1=2;

算法(10)Subarray Sum Equals K