|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 -这- 于 2021-7-10 14:43 编辑
给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。子数组 是数组的一段连续部分。
例如:
输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
我写的代码:class Solution(object):
def numSubarraysWithSum(self, nums, goal):
number = 0
for a in range(len(nums)+1):
for b in range(len(nums)+1):
if a < b:
text = sum(nums[a:b])
if text == goal:
number += 1
print(number)
if __name__ == '__main__':
s = Solution()
s.numSubarraysWithSum([1,0,1,0,1],2)
使用前缀和+哈希表方法:from collections import Counter
class Solution:
def numSubarraysWithSum(self,nums,goal):
countOnes = ans = 0
cnts = Counter({0:1})
for num in nums:
countOnes += num
ans += cnts[countOnes - goal]
cnts[countOnes] += 1
print(ans)
if __name__ == '__main__':
s = Solution()
s.numSubarraysWithSum([1,0,1,0,1],2)
现在就是不清楚第二个前缀和怎么遍历出来的,因为我第一个遍历结果:1、10、101、1010、10101、0、01、010、0101、1、10、101、0、01、1。那按照第二个代码的写法好像是直接相加,那这样的遍历结果是1、10、101、1010、10101.那是怎么跳到从第二个数开始遍历的呢 |
|