这道题我使用暴力解法,不出意外的超时了:
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语言写的答案,和我用的暴力解法区别不大:
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数量级以上就需要避免使用平方复杂度的答案呢?
下面补充一下该题目的正确解法:
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