【Leetcode-Hot100】和为k的子数组

题目

解答

这道题我使用暴力解法,不出意外的超时了:

python 复制代码
class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        len_nums = len(nums)
        result, s_nums = 0, 0

        for left in range(len_nums):
            right = left
            while right >=0:
                s_nums += nums[right]
                if s_nums == k:
                    result += 1
                right -= 1

            s_nums = 0

        return result
        

但我发现官方给出的第一个解法中Java语言写的答案,和我用的暴力解法区别不大:

java 复制代码
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0;
        for (int start = 0; start < nums.length; ++start) {
            int sum = 0;
            for (int end = start; end >= 0; --end) {
                sum += nums[end];
                if (sum == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

因此,我很疑惑,为什么同样平方复杂度的代码,我使用python却不能通过,这点很值得探究一下。

目前找到的答案是:

  • Java是编译型语言,循环和数学运算速度极快,适合处理密集型计算。

  • Python是解释型语言,循环效率较低,尤其在大规模数据时更明显。

因此在相同测试用例下Java可能通过而Python超时。

有大佬有其他的答案吗?是不是使用python语言,如果测试样例在4数量级以上就需要避免使用平方复杂度的答案呢?

下面补充一下该题目的正确解法:

python 复制代码
class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        len_nums = len(nums)
        result = 0
        map_nums = defaultdict(int)
        map_nums[0] = 1
        pre = 0
        
        for i in range(len_nums):
            pre += nums[i] 
            result += map_nums.get(pre-k, 0)
            # 先寻找 再更新
            map_nums[pre] += 1
        return result
相关推荐
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway2 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风2 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect2 天前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript