(1)給定乙個陣列,值全是正數,請返回累加和為給定值k的最長子陣列長度。
(2)給定乙個陣列,值可以為正、負和0,請返回累加和為給定值k的最長子陣列長度。
(1)l和r都只能往右滑動,不會回退
初始化: l = r = 0
如果視窗內[l, r]的和小於k, r++, sum += num[r]
如果和等於k,記錄視窗大小並視情況更新返回結果值
如果和大於k,sum -= num[l], l右邊滑
(2)必須以每個值為結尾的情況下累積和為k的最長子陣列長度
利用乙個map其中value為累積和,value為累積和最早出現的位置
eg:3 2 1 3
i = 0: sum = 4:希望找到sum=-2的最早出現的位置,但是map.get(-2)為null, 因此ma.put(4, 0)
i = 1: sum = 7, 希望找到sum= 7 - 6(k)的最早出現的位置,但是map.get(1)為null, 因此ma.put(7, 1)
i = 2:sum =9, 希望找到sum= 9 - 6(k)的最早出現的位置,但是map.get(3)為null, 因此map.put(9, 2)
i = 3: sum = 10, 希望找到sum= 10 - 6(k)的最早出現的位置,但是map.get(4)為0, 因此[1,3]之間的和一定為k,map.put(10, 3)
.....
如果k = 4,按照以上的思路,map.get(0)為空,找不到結果,所有在剛開始就應該map.put(0, -1),防止錯過0開始的所有的值,保證邏輯的完整性
public static int maxlength(int arr, int k)
hashmapmap = new hashmap();
map.put(0, -1);
int len = 0;
int sum = 0;
for(int i = 0; i < arr.length; i++)
if(!map.containskey(sum))
} return len;
}
(3)給定乙個陣列,值可以為正、負和0,請返回累加和小於等於k的最長子陣列長度。
4 3 -2 6 7 -3 -1
arr 0 1 2 3 4 5 6
min_sum 4 1 -2 6 3 -4 -1
min_index 0 2 2 3 6 6 6
min_sum[i]: 以nums[i]為開頭的連續子陣列的和的最小值
min_index:最右邊的索引下標
min_sum[i]
如果min_sum[i+1] <= 0:
=nums[i] + min_sum[i+1];
min_index[i] = min_index[i+1]
否則=nums[i]
min_index[i] = i
接著繼續利用滑動視窗來求解
l = r = 0
325 和等於 k 的最長子陣列長度
題目描述 給定乙個陣列 nums 和乙個目標值 k,找到和等於 k 的最長子陣列長度。如果不存在任意乙個符合要求的子陣列,則返回 0。注意 nums 陣列的總和是一定在 32 位有符號整數範圍之內的。示例 1 輸入 nums 1,1,5,2,3 k 3 輸出 4 解釋 子陣列 1,1,5,2 和等於...
LeetCode 和等於 k 的最長子陣列長度
q 給定乙個陣列 nums 和乙個目標值 k,找到和等於 k 的最長子陣列長度。如果不存在任意乙個符合要求的子陣列,則返回 0。注意 nums 陣列的總和是一定在 32 位有符號整數範圍之內的。示例 1 輸入 nums 1,1,5,2,3 k 3 輸出 4 解釋 子陣列 1,1,5,2 和等於 3,...
最長子陣列長度(清華912)
在實現的過程中,要注意判斷角標不能越界,以及相等的數的判斷方法。program entrance exam description 求乙個陣列a中連續相同數字的和等於s的最長子陣列長度。如a s 3,則所求子陣列長度為 3.要求 演算法的時間複雜度不超過o n 空間複雜度不超過o 1 author ...