1. 程式人生 > >LeeCode 560. 和為K的子陣列 [中等 40.7%]

LeeCode 560. 和為K的子陣列 [中等 40.7%]

給定一個整數陣列和一個整數 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