給定乙個陣列arr,該陣列無序,每乙個元素均為正數,在給定乙個正整數k,求arr的所有子陣列中所有元素相加和為k的最長子陣列的長度
例如:arr = [1,2,1,1,1],k=3,累加和為3的最長子陣列為[1,1,1],所以返回結果3
求最長子陣列和,我們可以想到使用字首和,字首和陣列的兩個下標之間的差值就是子陣列長度
解法:字首和加雜湊表優化
**:
public static int subarraysum(int nums, int k)
if(!map.containskey(sum))
}return len;
}
**解析:
如果單純的使用字首和,不使用雜湊表進行優化,那麼就是對字首和陣列進行遍歷,這道題因為全部是整數,所以我們遍歷一遍就可以(全部是正數,當不符合要求,移動邊界即可),如果陣列中有負數的話,我們就需要使用兩層for迴圈來對陣列進行遍歷(其中有負數,當不符合我們的條件的時候,我們需要遍歷完右邊的所有資料才能確定結果)。
使用字首和加雜湊表優化,不論其中有沒有負數,都可以達到時間複雜度為o(n),我們遍歷陣列的時候,計算字首和,我們將字首和作為key,當前字首和第一次出現的位置作為value存入雜湊表中,當我們每一次遍歷陣列元素的時候,判斷sum-k在雜湊表中有沒有對應的資料,如果有,從當前位置到雜湊表中對應的位置之間的差值就是子陣列的長度(通過sum-k可以得到子陣列的長度是因為,我們計算k的時候是使用presum[i]-presum[j] = k,那麼presum[j] = presum[i]-k,所以當雜湊表中存在sum-k就表示當前字首和陣列中存在子陣列和為k),遍歷完陣列後得到的最大長度就是最大子陣列長度
字首和方法一般用在求連續的累加和比如求連續子陣列長度、二叉樹的最大路徑、,我們可以使用雜湊表對字首和進行優化
和為aim的最長子陣列長度
求在給定的陣列中,子陣列中所有數加起來的和等於固定值 aim 的最長子陣列長度。準備乙個字典,key是從 1 位置到當前位置的累加和,value 是第一次得到這個累加和的位置。預設 1 位置的累加和是0.從頭開始遍歷陣列,每次都計算從 1 位置到當前位置的累加和是多少,並將位置資訊和 累加和存到字典...
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,...