Исключение генерирования кода в потоке "main" java.lang.OutOfMemoryError: пространство кучи Java

Я пытаюсь написать код, чтобы найти триплет, сумма которого равна заданной цели, используя список списков, но он выдает ошибку. Я попытался увеличить размер кучи в IntelliJ, а также в Eclipse, но он все равно выдает ошибку. Вот мой код:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TripleSum {

    public List<List<Integer>> findNumbers(int[] nums, int target){
        Arrays.sort(nums);
        List<List<Integer>> al = new ArrayList<List<Integer>>();
        ArrayList<Integer> lst = new ArrayList<>();
        int l, r;
        int n = nums.length;
        for(int i=0; i<n; i++){
            l=i+1;
            r= n-1;
            while(l<r){
                if (nums[i]+nums[l]+nums[r]==target){
                    lst.add(nums[i]);
                //lst.add(l);
                //lst.add(r);
                }

                else if (nums[i]+nums[l]+nums[r]<target)
                    l++;
                else
                    r--;

            }
            al.add(lst);
        }
        return al;
    }

    public static void main(String[] args){
        int[] arr = {12, 3, 4, 1, 6, 9, 6};
        TripleSum ts = new TripleSum();
        System.out.println(ts.findNumbers(arr, 24));
    }
}

Я рекомендую использовать переменные, на которые вы никогда не смотрите и не задаетесь вопросом, "что делает эта переменная?" - это значительно упрощает отладку.

corsiKa 12.03.2018 16:38

пытаетесь найти единую сумму из 3 чисел или все возможные комбинации из 3 чисел в списке, которые соответствуют вашей цели?

RAZ_Muh_Taz 12.03.2018 16:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не запускал отладчик, но подозреваю, что ваша проблема в этом коде:

        while(l<r){
            if (nums[i]+nums[l]+nums[r]==target){
                lst.add(nums[i]);
            //lst.add(l);
            //lst.add(r);
            }

            else if (nums[i]+nums[l]+nums[r]<target)
                l++;
            else
                r--;

        }

Допустим, сейчас l < r верен. Теперь давайте также скажем, что nums[i]+nums[l]+nums[r]==target истинно - поэтому мы добавим nums[i] в переменную lst.

Блоки else пропускаются.

Затем цикл зацикливается, и переменные не меняются. Вы будете зацикливаться навсегда. И добавить навсегда. До тех пор, пока, конечно, у вас не закончится место, где вы рухнете.

Другие вопросы по теме