Pregunta de algoritmo: dada una matriz y un número objetivo, encuentre la suma de los dos números en la matriz para que sea el valor objetivo e imprima los dos números. La complejidad del tiempo es O (N)

Ideas para resolver problemas:

El primero es el bucle transversal, permita que cada elemento se agregue al siguiente elemento y luego se compare con el valor objetivo y luego se emita.La primera capa del bucle controla el elemento comparado actualmente, y la segunda capa del bucle controla el número de comparaciones actuales. . Aquí se usa un bucle for doble y la complejidad de tiempo es O(n^2), lo que no cumple con los requisitos. El ejemplo de código es el siguiente

public static void main(String[] args) {
        int data[] = {2,7,9,10,12,15};
        int target = 14;
       //第一反应,循环遍历,一个一个相加进行比较
        for(int i=0;i<data.length;i++) {
            //每一个数需要比较几次
            for (int j=1+i;j<data.length;j++) {
                int total = data[i] + data[j];
                if (total == target) {
                    System.out.println("目标数:"+target+",Num1="+data[i]+",Num2="+data[j]);
                }
            }
        }
}

El segundo es usar Map en lugar de una capa de for loop para recorrer los elementos de la matriz y usar el método map.containsKey para determinar si hay un valor objetivo en la colección: el valor del elemento actual. , use el elemento como la clave, y el subíndice de matriz correspondiente al elemento Guárdelo como un valor en el mapa. Si existe, significa que se encuentra y genera. Esta vez la complejidad es O (n) para cumplir con los requisitos . El código es el siguiente

public static void main(String[] args) {
        int data[] = {2,7,9,10,12,15};
        int target = 14;
       
        //第二种,使用map结构代替一层for循环
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<data.length;i++) {
            //使用map来判断,判断map中是否含有
            if (map.containsKey(target-data[i])) {
                Integer integer1 = map.get(target - data[i]);
                System.out.println("目标数:"+target+",Num1="+data[integer1]+",Num2="+data[i]);
                break;
            }
            //没有就将值作为key,下标作为value放在map中
            map.put(data[i],i);

        }
    }

Nota: En el futuro, si se encuentra con la situación de usar doble for loop para recorrer para encontrar elementos, puede considerar si puede usar el mapa para reemplazar una capa para reducir la complejidad del tiempo. Resultados de la prueba profesional: el tiempo de ejecución del primer tipo es de 40 a 88 ms, y el tiempo de ejecución del segundo tipo es de 1 a 5 ms. ¡Obviamente, la eficiencia de ejecución del segundo tipo es mucho más rápida!

Supongo que te gusta

Origin blog.csdn.net/guliudeng/article/details/130722205
Recomendado
Clasificación