Este tema es un tema relativamente simple, blogger de cepillo leetcode por encima de los problemas encontrados, por lo que este disco un poco, con la esperanza de ayudar a los estudiantes en cuestión.
En primer lugar quiero hablar acerca de las ideas:
1. array Suponiendo tiene n elementos, el elemento de suma cuando este n no es 0 mod 3 indica que la matriz no es necesariamente igualmente dividido por tres.
2. Utilizamos todos los elementos y divididos por 3 para obtener la media
3. izquierdo indica el comienzo de la matriz, parte derecha indica el final de la matriz, y la matriz representa una parte izquierda y una left_sum, porción right_sum y una matriz derecha representa un valor de ajuste que indica si un left_sum bool y right_sum iguales, y el valor predeterminado es falso
4. Cuando el puntero es menor que la mano derecha a la izquierda, seguimos iteraciones, y cada iteración de los extremos izquierdo y derecho de la valor de acumulación y la left_sum right_sum anteriormente, hasta que los dos son iguales, y igual a la media, a continuación, nos fijamos el valor bool predefinido es cierto y salir del bucle
5. Después de ciclo se ha determinado si la izquierda y la derecha entre la al menos una espaciales y garantizar la igualdad de valor y la tercera left_sum right_sum, si indica que la matriz puede ser de tres iguales, si no, la matriz no puede ser tres porciones iguales.
Bueno, la idea general del algoritmo es el caso, voy a poner el código de abajo, vale la pena señalar que el vector <int> v = {1,2,3,4,5} Tal declaración sólo puede funcionar correctamente después de c ++ 11 espero que prestar atención.
1 #include <iostream> 2 #include <numérico> 3 #include <stdio.h> 4 #include <vector> 5 usando espacio de nombres std; 6 7 clase Solución 8 { 9 pública : 10 bool canThreePartsEqualSum (vector < int > & A) 11 { 12 int suma = acumulan (A.begin (), A.end (), 0 ); // 求和 13 si (suma% 3 ! = 0 ) 14 de retorno en false ; // a tres modulo la matriz no puede ser igual a 0 trisecado 15 int AVG = SUM / 3. ; // obtener Mean 16 int izquierda = 0 , derecha = a.size () - 1. ; // conseguir alrededor puntero . 17 int left_sum = 0 , right_sum = 0 ; // blanco initialize e izquierda 18 es BOOL en Flag = false ; // determinar si la izquierda y derecha y puede calcularse iguales entre sí 19. el tiempo (izquierda < derecha) 20 es { //Cuando el puntero es inferior a la izquierda a la derecha sigue bucle 21 es SI (Left_sum =! AVG) 22 es { // si la media es inferior a la izquierda, derecha acumulativo 23 es left_sum + = A.at (de izquierda ++ ); 24 } 25 IF (right_sum =! AVG) 26 es { // si la media es menor que la derecha y la izquierda acumulativo 27 right_sum A.at + = (derecha - ); 28 } 29 IF (left_sum && right_sum == == AVG AVG) 30 { // si y aproximadamente igual a la media, fuera del bucle 31 es en Flag =true ; 32 PAUSA ; 33 es } 34 es } 35 de retorno En Flag && derecho - izquierdo> . 1 ; // cuando el puntero intermedia izquierda y derecha y la izquierda es igual a un mínimo de espacio, la matriz puede ser representado trisección 36 } 37 [ }; 38 es int principal ( void ) { 39 Solución * = s nuevo nuevo Solution (); 40 Vector < int > V = { . 3 , . 3 , . 6 , . 5 , - 2 , 2 , . 5 , . 1 , -. 9 , . 4 }; 41 es BOOL resultado = S-> canThreePartsEqualSum (V); 42 es COUT << " la matriz " << (Resultado? " Can " : " no " ) << " se trisected " << endl; 43 }
Bueno, lo anterior es el contenido del ensayo, el código fuente puede ser descargado desde (https://github.com/maoqifan1/leetcode.git) mi github, nos vemos la próxima vez.