文章目录
 
 
代码随想录之贪心系列困难算法
 
1.最大子序和(最大子数组和)
 
 
2.加油站
 
2.1暴力
 
func canCompleteCircuit(gas []int, cost []int) int {
	for i := 0; i < len(gas); i++ {
		
		rest := gas[i] - cost[i]
        
		index := (i + 1) % len(gas)
		for rest > 0 && index != i {
			rest += gas[index] - cost[index]
			index = (index + 1) % len(gas)   
		}
		
		if rest >= 0 && index == i {
			return i
		}
		
	}
	return -1
}
空间复杂度:$O(n)$
 

 
2.2贪心
 
func canCompleteCircuit(gas []int, cost []int) int {
	curSum := 0
	totalSum := 0
	start := 0
    
	for i := 0; i < len(gas); i++ {
		curSum += gas[i] - cost[i]
		totalSum += gas[i] - cost[i]
		if curSum < 0 {
			start = i+1
			curSum = 0
		}
	}
    
	if totalSum < 0 {
		return -1
	}
    
	return start
}
那么局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。
全局最优:找到可以跑一圈的起始位置。
那么为什么一旦[i,j] 区间和为负数,起始位置就可以是j+1呢,j+1后面就不会出现更大的负数?
看如下图:
为什么最后还要进行一下if totalSum < 0 判断?
为什么本题解法没有体现到环形数组呢?
i不一定要
 

 

 
