返回

LeetCode破解:重新认识整除的意义

后端







## LeetCode破解:重新认识整除的意义

大家好,我是LeetCode的资深玩家,今天我来分享一道LeetCode题目,这道题是关于整除的。整除在数学中是一个非常基本的概念,但在LeetCode中,整除的意义往往与我们通常理解的有所不同。这道题目正是考察了这一点。

## 题目

给你一个整数数组nums和一个整数k,你需要找出数组中所有的子数组,使得这些子数组的元素之和是k的整数倍。

## 示例1:

输入:nums = [4, 5, 0, -2, -3, 1], k = 5
输出:[[0], [4, 1]]

## 示例2:

输入:nums = [1, 2, 3], k = 5
输出:[]

## 思路分析

首先利用测试用例搞清楚题目中的除法是指整除而非向下取整,然后看看我们通常理解的整除和LeetCode中的整除有什么不同。

我们通常理解的整除是指两个整数相除,余数为0。例如,10除以2,余数为0,所以102的整数倍。但是在LeetCode中,整除的意义有所不同。在LeetCode中,整除是指两个整数相除,余数为01。例如,10除以3,余数为1,所以103的整数倍。

知道了这一点,我们就可以轻松地解决这道题目了。我们只需要遍历数组,并计算每个子数组的元素之和。如果某个子数组的元素之和是k的整数倍,那么我们就将这个子数组添加到结果列表中。

## 代码实现

```python
def subarraySum(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    # 用来存储子数组和的字典
    sum_dict = {}
    # 将0加入字典,因为空数组的和也是k的倍数
    sum_dict[0] = 1
    # 用来存储子数组的和
    current_sum = 0
    # 用来存储结果列表
    result = []
    # 遍历数组
    for num in nums:
        # 更新子数组的和
        current_sum += num
        # 如果当前子数组的和减去k是某个子数组的和,那么就说明找到了一个符合条件的子数组
        if current_sum - k in sum_dict:
            # 将符合条件的子数组添加到结果列表中
            result.extend(sum_dict[current_sum - k])
        # 将当前子数组的和加入字典
        if current_sum not in sum_dict:
            sum_dict[current_sum] = []
        sum_dict[current_sum].append(current_sum)
    # 返回结果列表
    return result

结语

希望这篇文章对您有所帮助。如果您在LeetCode中遇到任何问题,欢迎随时与我联系。