【Pregunta diaria de LeetCode】 [Moderado] 134. Gasolinera

【Pregunta diaria de LeetCode】 [Moderado] 134. Gasolinera

134. Gasolinera

134. Gasolinera

Idea de algoritmo: matriz

tema:

Inserte la descripción de la imagen aquí

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:

  1. Suponga que hay x 'que es una de las estaciones [x, y];
  2. x puede llegar a cada estación de xay, entonces la suma de [x, x '] y la suma de [x, y] deben ser> = 0,
  3. x no puede alcanzar la siguiente parada de y, entonces la suma de [x, y + 1] se superpone a <0;
  4. Puede verse que [x, y + 1] - [x, x '] = [x', y + 1] <0;
  5. 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
Inserte la descripción de la imagen aquí
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;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_39457586/article/details/109774717
Recomendado
Clasificación