首页 > 试题广场 >

和为K的连续子数组

[编程题]和为K的连续子数组
  • 热度指数:20991 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个无序数组 arr , 其中元素可正、可负、可0。给定一个整数 k ,求 arr 所有连续子数组中累加和为k的最长连续子数组长度。保证至少存在一个合法的连续子数组。
[1,2,3]的连续子数组有[1,2],[2,3],[1,2,3] ,但是[1,3]不是

数据范围: 1 \le n \le 10^5
要求:空间复杂度 , 时间复杂度
示例1

输入

[1,-2,1,1,1],0

输出

3
示例2

输入

[0,1,2,3],3

输出

3

备注:
class Solution:
    def maxlenEqualK(self , arr: List[int], k: int) -> int:
        sum_index_map = {0:-1}
        sum = 0
        max = 0
        for i in range(0,len(arr)):
            sum = sum + arr[i]
            if (sum - k) in sum_index_map:
                l = i - sum_index_map[sum - k]
                if max < l:
                    max = l
            else:
                if sum not in sum_index_map:
                    sum_index_map[sum] = i
        return max

发表于 2024-06-03 21:57:09 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# max length of the subarray sum = k
# @param arr int整型一维数组 the array
# @param k int整型 target
# @return int整型
#
class Solution:
    def maxlenEqualK(self , arr: List[int], k: int) -> int:
        # write code here
        if len(arr) == 0:
            return 0
             
        dp = [0 for i in range(len(arr))]
        dp[0] = arr[0]

        # 初始化一个前缀和数列
        for i in range(1, len(dp)):
            dp[i] = dp[i-1] + arr[i]

        m = {}
        m[0] = [-1]
        # 记录前缀和出现的位置
        for i in range(len(dp)):
            if dp[i] in m:
                m[dp[i]].append(i)
            else:
                m[dp[i]] = [i]
        
        # 寻找前缀和减去目标值,得到需要寻找的前缀和
        max_n = 0
        for i in range(len(dp)):
            target_n = dp[i] - k

            if target_n not in m:
                continue

            target_arr = m[target_n]
            for target_index in target_arr:
                if target_index > i:
                    continue
                
                max_n = max(max_n, i-target_index)
        return max_n

发表于 2024-04-26 23:36:44 回复(0)