【Pregunta diaria de LeetCode】 [Moderado] 134. Gasolinera
134. Gasolinera
Idea de algoritmo: matriz
tema:
código java-fuerza bruta
Violencia, enumere cada puesto y juzgue que puede viajar durante una semana
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//暴力,枚举每一个位置,判断能都行驶一周
int n = gas.length;
for (int i = 0; i < n; i++) {
//遍历每一个位置
int oilMass = 0;
int j = i;
while (oilMass >= 0) {
//判断当前位置能否行驶一周
oilMass = oilMass + gas[j] - cost[j];
j = (j + 1) % n;
if (oilMass >= 0 && j == i) {
//如果可以则返回i
return i;
}
}
}
return -1;//不能行驶一周
}
}
código java: atravesarlo de nuevo
Usando, x puede alcanzar yy cualquier estación antes de y, pero no puede alcanzar la siguiente estación de y, entonces ninguna estación en el intervalo (x, y) no puede alcanzar la siguiente estación de y;
explique:
- Suponga que hay x 'que es una de las estaciones [x, y];
- x puede llegar a cada estación de xay, entonces la suma de [x, x '] y la suma de [x, y] deben ser> = 0,
- x no puede alcanzar la siguiente parada de y, entonces la suma de [x, y + 1] se superpone a <0;
- Puede verse que [x, y + 1] - [x, x '] = [x', y + 1] <0;
- Por lo tanto, cualquier estación en el intervalo de [x, y] no puede llegar a la siguiente estación de y; (x se puede saltar directamente a y + 1 al atravesar, y no es necesario considerar la estación intermedia)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//遍历一遍,O(n)
//利用,x不能到y的下一站,则[x,y]区间内的任意一站无法到达y的下一站
int n = gas.length;
int i = 0;
while (i < n) {
int oilMass = 0;
int j = i;
int count = 0;//用来计数,是否行驶了一周
//寻找 i 最大能到达的站 y
while (oilMass >= 0 && count < n) {
//判断当前位置能否行驶一周
oilMass = oilMass + gas[j] - cost[j];
j = (j + 1) % n;
count++;
if (oilMass >= 0 && count == n) {
//如果行驶了一周,返回i
return i;
}
}
i = i + count;//如果不能行驶一周,i 直接移动到 y 的下一站
}
return -1;//不能行驶一周
}
}
código java
Utilice, como se muestra en la figura siguiente, para analizar la
función principal del código fuente: busque el punto más bajo de la línea negra en la figura; si la suma> = 0, el punto de partida es la siguiente posición del punto más bajo; si la suma <0, no hay solución
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int totalGas = 0;//总和
int minGas = Integer.MAX_VALUE;
int mindx = 0;
for (int i = 0; i < n; i++) {
totalGas += gas[i] - cost[i];
if (totalGas < minGas) {
//寻找最低点,记录下标
minGas = totalGas;
mindx = i;
}
}
return totalGas >= 0 ? (mindx + 1) % n : -1;
}
}