连续子序列为定值问题
给定一个数组nums和定值k,求连续子序列之和为k的个数。
这个题,由于数组并不是排序号的递增整数数组,所以感觉用滑动窗口或者判断大小的方法来做不合适。
但是由于你最关注的是等于k的子序列数目,关心的是和而不是下标,所以可以考虑用一个字典来存储状态,结果res则累加。
sum为遍历到i时,从0到i的序列和。
判断条件:
当序列和等于k,也就是sum-k为0时,说明该连续子序列之和为k,符合条件,res+1,也可以再初始化的时候{0:1},这样避免每次都要判断一次再累加。
arr更新条件:
当前和为sum的时候,字典中以sum为key的值+1
由于只关心sum的值,又是依次遍历,所以可以在O(n)时间内完成搜索
#Given unsorted array nums = [1, -1, 5, -2, 3], k = 3,
#return 3. (Because the continous subarrays [1, -1, 5, -2], [5, -2], [3] sums to 3)
class Solution(object):
def solution(self, nums, k):
left = 0
right = len(nums)
res = 0
sum_ = 0
arr = {0:1}
for left in range(0, right):
sum_ = sum_ + nums[left]
res = res + arr.get(sum_ -k ,0)
arr[sum_] = arr.get(sum_,0) +1
return res
if __name__ =="__main__":
nums = [1, -1, 5, -2, 3]
k=3
sol = Solution()
print(sol.solution(nums,k))
连续子序列之和最大/最小问题
这个比较常见,穷举、DP都可以解决。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],b[N], dp[N];;
int n ;
int ans ;
const int INF = 0x3f3f3f;
int main()
{
int n;
cout<<"please input size"<<endl;
cin>>n;
cout<<"please input data"<<endl;
for(int i =1;i<=n;++i)
{
cin>>a[i];
}
dp[1] = a[1];
int ans =0;
for(int i =2;i<=n;++i)
{
if(dp[i-1]>0)
dp[i] =dp[i-1] + a[i];
else
dp[i] = a[i];
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
system("pause");
return 0;
}