题目:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
# 最大子序和,穷举法
# 这个也有好处,就是适用性
# 坏处就是时间复杂度以及消耗资源
c <- c(-2,1,-3,4,-1,2,1,-5,4)
max_zxl <- function(c){
# 放一个储存结果的re_sum
re_sum <- NULL
for (i in 1:length(c)) {
for (j in 1:length(c)) {
if(i >= j) {
# 把所有可能的结果都合并放一起。
re_sum <- cbind(re_sum,sum(c[i:j]))
}else{
}
}
}
# 返回需要的最大值
return(max(re_sum))
}
#试验测试结果
max_zxl(c)
结果:
It's ok.
但是这个缺点也很明显,如果体量上去会很耗资源。
下面提供另外一种算法吧。
# another easy way
# 这边会存在一个问题的,关于正负的问题
max_zxl_2 <- function(c){
# 做一个逻辑判断,是否都是负数
if (all(c < 0)) {
return(max(c))
}else{
# max_sum为最后的结果,this_sum为中间过程需要
max_sum = this_sum = 0
for (i in 1:length(c)) {
# 累加this_sum
this_sum <- this_sum + c[i]
# if 判断控制流语句
if(this_sum > max_sum){
max_sum <- this_sum
}else if(this_sum < 0)
this_sum <- 0
}
# 返回需要的结果max_sum
return(max_sum)
}
}
测试结果也是一样的,但是复杂度会降低:
还有一个分治法,这个还没研究过,改天看看,试试。