Update
This commit is contained in:
@@ -48,7 +48,7 @@
|
||||
|
||||
## 暴力方法
|
||||
|
||||
暴力的方法很明显就是$O(n^2)$的,遍历每一个加油站为起点的情况,模拟一圈。
|
||||
暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。
|
||||
|
||||
如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。
|
||||
|
||||
@@ -119,8 +119,8 @@ public:
|
||||
}
|
||||
};
|
||||
```
|
||||
* 时间复杂度:$O(n)$
|
||||
* 空间复杂度:$O(1)$
|
||||
* 时间复杂度:O(n)
|
||||
* 空间复杂度:O(1)
|
||||
|
||||
**其实我不认为这种方式是贪心算法,因为没有找出局部最优,而是直接从全局最优的角度上思考问题**。
|
||||
|
||||
@@ -136,18 +136,26 @@ public:
|
||||
|
||||
每个加油站的剩余量rest[i]为gas[i] - cost[i]。
|
||||
|
||||
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。
|
||||
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
|
||||
|
||||
如图:
|
||||

|
||||
|
||||
那么为什么一旦[i,j] 区间和为负数,起始位置就可以是j+1呢,j+1后面就不会出现更大的负数?
|
||||

|
||||
|
||||
如果出现更大的负数,就是更新j,那么起始位置又变成新的j+1了。
|
||||
那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?
|
||||
|
||||
而且j之前出现了多少负数,j后面就会出现多少正数,因为耗油总和是大于零的(前提我们已经确定了一定可以跑完全程)。
|
||||
如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了。
|
||||
|
||||
**那么局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置**。
|
||||
那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图:
|
||||
|
||||

|
||||
|
||||
如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。
|
||||
|
||||
区间和1 + 区间和2 < 0 同时 区间和2>0,只能说明区间和1 < 0, 那么就会从假设的箭头初就开始从新选择其实位置了。
|
||||
|
||||
|
||||
**那么局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置**。
|
||||
|
||||
局部最优可以推出全局最优,找不出反例,试试贪心!
|
||||
|
||||
@@ -173,8 +181,8 @@ public:
|
||||
}
|
||||
};
|
||||
```
|
||||
* 时间复杂度:$O(n)$
|
||||
* 空间复杂度:$O(1)$
|
||||
* 时间复杂度:O(n)
|
||||
* 空间复杂度:O(1)
|
||||
|
||||
**说这种解法为贪心算法,才是有理有据的,因为全局最优解是根据局部最优推导出来的**。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user