【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
相关推荐
budingxiaomoli1 小时前
算法--滑动窗口(二)
算法
ID_180079054731 小时前
淘宝实时拍立淘按图搜索数据|商品详情|数据分析提取教程
算法·数据分析·图搜索算法
l1t1 小时前
Lua与LuaJIT的安装与使用
算法·junit·单元测试·lua·luajit
Emilia486.3 小时前
【Leetcode&nowcode】代码强化练习(二叉树)
算法·leetcode·职场和发展
墨染点香3 小时前
LeetCode 刷题【135. 分发糖果】
算法·leetcode·职场和发展
秋风战士3 小时前
通信算法之336 :3GPPMixed Mode Turbo Decoder
算法·matlab·fpga开发·信息与通信·基带工程
是那盏灯塔3 小时前
【算法】——动态规划之01背包问题
数据结构·c++·算法·动态规划
im_AMBER3 小时前
Leetcode 41
笔记·学习·算法·leetcode
jinmo_C++4 小时前
数据结构_深入理解堆(大根堆 小根堆)与优先队列:从理论到手撕实现
java·数据结构·算法
IT19954 小时前
OpenSSL3.5.2实现SM3数据摘要生成
算法·哈希算法·散列表