LeeCode 560. 和為K的子陣列 [中等 40.7%]
阿新 • • 發佈:2019-08-31
給定一個整數陣列和一個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。
說明 :
陣列的長度為 [1, 20,000]。
陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解析:
定義一個子序列用來從左到右讀取列表裡面的數,滿足一下讀取方式:
1,子序列的和小於K,則繼續讀值進來;
2,子序列的和大於K,則刪除第一值;
3,子序列的和等於K,則輸出;
4,迴圈1-3,直到所有的列表值讀取結束。
優化:
當單個值大於K時,則可以清空子序列,因為不管執行1還是2,肯定結果都大於K。
class Solution: def subarraySum(self, nums: list, k: int) -> int: sub_array = [] # 儲存子序列 i = 0 # 遊標 length = len(nums) # 列表長度 while i < length: sum_array = sum(sub_array) if nums[i] > k: # 當前單個值大於K,那麼子序列置空,遊標後移 sub_array.clear() i += 1 continue if sum_array < k: # 如果子序列的和小於k,則遊標繼續取值進來,遊標後移 sub_array.append(nums[i]) i += 1 continue if sum_array > k: # 如果子序列值大於k,則把第一個元素值刪除 sub_array.pop(0) continue if sum_array == k: # 等於的話就輸出,然後為下一步做準備,刪除第一個,然後遊標取值,再後移 print(sub_array) sub_array.pop(0) sub_array.append(nums[i]) i += 1 continue # 子序列最後和等於K if sum(sub_array) == k: print(sub_array) if __name__ == '__main__': nums = [1, 2, 3, 4, 5, 6, 7, 16, 14, 1, 15, 5, 6, 4] k = 15 s = Solution() s.subarraySum(nums, k)
輸出結果:
D:\Anaconda3\python.exe E:/PythonSpace/560.py
[1, 2, 3, 4, 5]
[4, 5, 6]
[14, 1]
[15]
[5, 6, 4]
Process finished with exit code 0