今日中等題:https://leetcode-cn.com/problems/maximum-size-subarray-sum-equals-k/
思路和題解不一樣,想用數(shù)學(xué)的方法,結(jié)合雙指針來做,結(jié)果單個用例能跑過,k稍微不那么好找一點(diǎn)的數(shù)組,就運(yùn)算超時了,說明算法還是比較差的,時間復(fù)雜度太高。
今天先記錄一下我稀碎的解題思路,明天再繼續(xù)研究題解算法:
- 既然是找最長連續(xù)子串,那么最大的一定是數(shù)組本身,所以先把整個數(shù)組的和求出來為sum
- 用sum和k做比較,如果sum比較大,那肯定要把頭尾里比較大的那個舍掉,這時候用頭尾指針i和l-j-1來定義坐標(biāo),然后把sum中舍棄的那個值對應(yīng)減掉,也就是sum -=nums[x]
- 再比較,如果sum和k相等了,那就把l-j-1-i輸出,此刻一定是最大長度
其實(shí)這個方法是從測試數(shù)據(jù)里找規(guī)律,反推出來的,寫的時候隱隱感覺到是有問題的,可能會誤刪一些數(shù)據(jù)。

題目的首個答案可以通過

經(jīng)不起考驗(yàn)
class Solution {
public int maxSubArrayLen(int[] nums, int k) {
int i = 0, j = 0, l = nums.length, sum = 0, max = 0;
for (int m=0; m< l-1; m++) {
sum += nums[m];
}
while(i+j<l-1) {
if (sum == k) {
max = Math.max(max, l-j-1-i);
return max;
}
else if ((sum > k && nums[i] >= nums[l-j-1]) || (sum < k && nums[i] < nums[l-j-1])) {
i++;
sum -= nums[i];
}
else if ((sum > k && nums[i] < nums[l-j-1]) || (sum > k && nums[i] >= nums[l-j-1])) {
j++;
sum -= nums[j];
}
}
return 0;
}
}