【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 小时前
leetcode_day4_筑基期_《绝境求生》
算法
清木铎1 小时前
leetcode_day10_筑基期_《绝境求生》
算法
j_jiajia1 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法
源代码•宸2 小时前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
我命由我123452 小时前
Photoshop - Photoshop 工具栏(57)模糊工具
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
Jasmine_llq3 小时前
《CF280C Game on Tree》
数据结构·算法·邻接表·深度优先搜索(dfs)·树的遍历 + 线性累加统计
小棠师姐3 小时前
支持向量机(SVM)入门:超平面与核函数的通俗解释
算法·python机器学习·支持向量机svm·超平面可视化·核函数应用
im_AMBER4 小时前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
今儿敲了吗4 小时前
01|多项式输出
c++·笔记·算法
Xの哲學4 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法