今日中等题:https://leetcode-cn.com/problems/maximum-size-subarray-sum-equals-k/
思路和题解不一样,想用数学的方法,结合双指针来做,结果单个用例能跑过,k稍微不那么好找一点的数组,就运算超时了,说明算法还是比较差的,时间复杂度太高。
今天先记录一下我稀碎的解题思路,明天再继续研究题解算法:
- 既然是找最长连续子串,那么最大的一定是数组本身,所以先把整个数组的和求出来为sum
- 用sum和k做比较,如果sum比较大,那肯定要把头尾里比较大的那个舍掉,这时候用头尾指针i和l-j-1来定义坐标,然后把sum中舍弃的那个值对应减掉,也就是sum -=nums[x]
- 再比较,如果sum和k相等了,那就把l-j-1-i输出,此刻一定是最大长度
其实这个方法是从测试数据里找规律,反推出来的,写的时候隐隐感觉到是有问题的,可能会误删一些数据。
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;
}
}