| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【算法】Gas Station(LeetCode134) -> 正文阅读 |
|
[数据结构与算法]【算法】Gas Station(LeetCode134) |
1. 概述https://leetcode.com/problems/gas-station/ 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则保证它是唯一的。 ? 2. 思路与代码思路 最后需要判断,如果 ∑ i = 0 n ? 1 ( g a s [ i ] ? c o s t [ i ] ) > = 0 \sum_{i=0}^{n-1}(gas[i] - cost[i]) >= 0 ∑i=0n?1?(gas[i]?cost[i])>=0 ,则说明能够从 start 站出发,绕一圈回到 start 站。 代码
? 3. 证明cur < 0时意味着无法从第 i 站到达第 i + 1 站,需要从 i + 1 站开始重新尝试,这很好理解,但是为什么 ∑ i = 0 n ? 1 ( g a s [ i ] ? c o s t [ i ] ) > = 0 \sum_{i=0}^{n-1}(gas[i] - cost[i]) >= 0 ∑i=0n?1?(gas[i]?cost[i])>=0 就一定能从 start 站开始绕一圈再回到 start 站呢? 反证法证明
那么就可以得出条件3 ( g a s [ j + 1 ] ? c o s t [ j + 1 ] ) + ( g a s [ j + 2 ] ? c o s t [ j + 2 ] ) + . . . + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[j + 1] - cost[j + 1]) + (gas[j + 2] - cost[j + 2]) + ... + (gas[start] - cost[start]) > 0 (gas[j+1]?cost[j+1])+(gas[j+2]?cost[j+2])+...+(gas[start]?cost[start])>0 ? j = start - 1 因为是从 start 站出发的,说明不能从 start - 1 站到达 start 站,而与条件3是相矛盾的,因此 j 不能等于 start - 1。 ? 已知不能从 start - 1 站到达 start 站,因此有 g a s [ s t a r t ] ? c o s t [ s t a r t ] < 0 gas[start] - cost[start] < 0 gas[start]?cost[start]<0 并且有条件3: ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[start - 1] - cost[start - 1]) + (gas[start] - cost[start]) > 0 (gas[start?1]?cost[start?1])+(gas[start]?cost[start])>0 那么就有 ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) > 0 (gas[start - 1] - cost[start - 1]) > 0 (gas[start?1]?cost[start?1])>0 也就是说,能够从 start - 2 站开始到达 start - 1 站,而且 ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[start - 1] - cost[start - 1]) + (gas[start] - cost[start]) > 0 (gas[start?1]?cost[start?1])+(gas[start]?cost[start])>0,那么从 start - 2 站开始到达了 start - 1 站,可以继续从 start - 1 站到达 start 站,因为剩下的油是够的。 产生了矛盾,因此 j 不能等于 start - 2。 ? 已知不能从 start - 1 站到达 start 站,因此有 g a s [ s t a r t ] ? c o s t [ s t a r t ] < 0 gas[start] - cost[start] < 0 gas[start]?cost[start]<0 并且有条件3: ( g a s [ s t a r t ? 2 ] ? c o s t [ s t a r t ? 2 ] ) + ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[start - 2] - cost[start - 2]) + (gas[start - 1] - cost[start - 1]) + (gas[start] - cost[start]) > 0 (gas[start?2]?cost[start?2])+(gas[start?1]?cost[start?1])+(gas[start]?cost[start])>0 如果 g a s [ s t a r t ? 2 ] ? c o s t [ s t a r t ? 2 ] < 0 gas[start - 2] - cost[start - 2] < 0 gas[start?2]?cost[start?2]<0,那么就有 ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[start - 1] - cost[start - 1]) + (gas[start] - cost[start]) > 0 (gas[start?1]?cost[start?1])+(gas[start]?cost[start])>0 而根据上面的证明, ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) + ( g a s [ s t a r t ] ? c o s t [ s t a r t ] ) > 0 (gas[start - 1] - cost[start - 1]) + (gas[start] - cost[start]) > 0 (gas[start?1]?cost[start?1])+(gas[start]?cost[start])>0 是会产生矛盾的,因此必然有 g a s [ s t a r t ? 2 ] ? c o s t [ s t a r t ? 2 ] > = 0 gas[start - 2] - cost[start - 2] >= 0 gas[start?2]?cost[start?2]>=0 也即,从 start - 3 站开始能够到达 start - 2 站。 ? ( g a s [ s t a r t ? 2 ] ? c o s t [ s t a r t ? 2 ] ) + ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) > 0 (gas[start - 2] - cost[start - 2]) + (gas[start - 1] - cost[start - 1]) > 0 (gas[start?2]?cost[start?2])+(gas[start?1]?cost[start?1])>0 那么,根据上面的证明,能从 start - 3 站开始到达 start - 2 站,并且在到达了 start - 2 站后有 ( g a s [ s t a r t ? 2 ] ? c o s t [ s t a r t ? 2 ] ) + ( g a s [ s t a r t ? 1 ] ? c o s t [ s t a r t ? 1 ] ) > 0 (gas[start - 2] - cost[start - 2]) + (gas[start - 1] - cost[start - 1]) > 0 (gas[start?2]?cost[start?2])+(gas[start?1]?cost[start?1])>0,也就是油足够从 start - 2 站继续到达 start - 1站。 ? ? ? 同理,可以证明 j 不能取其他的值,也即 j 是不存在的,那么即说明,只要 ∑ i = 0 n ? 1 ( g a s [ i ] ? c o s t [ i ] ) > = 0 \sum_{i=0}^{n-1}(gas[i] - cost[i]) >= 0 ∑i=0n?1?(gas[i]?cost[i])>=0 ,就可以从 start 站绕一圈回到 start 站。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:46:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |