Неэффективность метода - PullRequest
0 голосов
/ 29 мая 2018

Это из битв кода.Метод работает, но, очевидно, занимает слишком много времени для больших входов.Может кто-нибудь объяснить, что неэффективно в этом решении?

Вопрос: Для массива целых чисел напишите функцию, которая определяет, содержит ли массив дубликаты.Ваша функция должна возвращать true, если какой-либо элемент встречается в массиве хотя бы дважды, и должна возвращать false, если каждый элемент различен.

Пример

Для a = [1, 2, 3,1], выходные данные должны содержать hasDuplicates (a) = true.

В данном массиве есть две единицы.

Решение:

    static boolean containsDuplicates(int[] a) {
    boolean elementRepeat = false;
    for (int loop1 = 0; loop1 < a.length; loop1++){
        for (int loop2 = 0; loop2 < a.length; loop2++){
            if (a[loop1] == a[loop2] && loop1!=loop2){                   
                elementRepeat = true;
                return elementRepeat;
            }
        }
    }

    return elementRepeat;
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Один из способов сделать это - сохранить массив в Set, а затем сравнить длину массива и набора.Вот как:

 static boolean containsDuplicates(int[] array) {
    HashSet<Integer> integers = new HashSet<>();
    Arrays.stream(array).forEach(integers::add);
    array.length == integers.size();
 }
0 голосов
/ 29 мая 2018

Я думаю, что @Henry сделал очень хорошее предложение.

Это пример:

import java.util.HashSet;
import java.util.Set;

public class Test4 {

    public static void main(String[] args) {
        Integer[] arrayInt = {1, 2, 3, 1};

        Set<Integer> integers = new HashSet<Integer>();
        boolean hasDuplicates = false;

        for (Integer integerNumber : arrayInt) {
            if (!integers.add(integerNumber)) {
                hasDuplicates = true;
                break;
            }
        }

        System.out.println("Contains duplicates? " + hasDuplicates);
    }

}

И он напечатает:

Содержит дубликаты?правда

...