Метод, который находит наименьший подмассив, размер которого больше X, возвращает неправильное число

#java #arrays #sub-array

#java #массивы #подмассив

Вопрос:

Например, {1, 4, 45, 6, 0, 19} и число 51 должно возвращаться 3 , потому что количество элементов в наименьшем подмассиве, которые вместе больше 51 , равно 3: {4,45,6}` .

{7, 2, 5, 10, 1} и число 9 должно вернуться 1 , потому что число элементов в наименьшем возможном подмассиве больше, чем 9 есть {10} .

Если массив равен нулю или пуст, или в массиве нет подмассива, который больше заданного числа, метод должен вернуть -1. Мне не разрешено использовать пакет array из java.util. Моя цель — выполнить метод за O (n) время. Пока что это мой код, если в массиве нет подмассива, превышающего заданное число, он возвращает ошибку OutofBounds . У кого-нибудь есть подсказка?

 public static int smallestSubSum(int arr[], int x) {
    int left = 0, right = 1, smallest = 0;
    int sum = arr[right];

    for (int i = 1; i < arr.length; i  ) {
        if (sum > x)
            smallest = left - right;
        else
            right  ;
        sum  = arr[right];
        if (sum > x amp;amp; left - right < smallest) {
            smallest = left - right;
            left  ;
        } else
            sum -= arr[left];
        left  ;
        if (sum > x amp;amp; left - right < smallest)
            smallest = left - right;
    }

    return smallest;
}
 

Редактировать: возможно, мне следует объяснить, что я пытался сделать со своим кодом, в основном я хотел, чтобы сумма содержала первые два элемента в коде, а затем сравнивала с каждой итерацией «if», если сумма текущих элементов больше или меньше X, если нет, я поднимаю правильный элементчтобы пойти дальше, если да, я удаляю первый элемент, «левый».

Массив {1, 4, 45, 6, 0, 19} и число 51 возвращает 2, хотя результат должен быть равен 3. Я не знаю почему, потому что мой правый достигает индекса 3, который равен 6, а левый достигает индекса 1, который равен 4, поэтому результат действительно должен быть {4,45,6}, но он не доходит до него.

Ответ №1:

Это лучшее, что я мог сделать.

Вот мои результаты тестирования.

 [1, 4, 45, 6, 0, 19] -> 51
3
[7, 2, 5, 10, 1] -> 9
1
[1, 4, 45, 6, 0, 19] -> 200
-1
 

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

Вот полный исполняемый код, с которым я тестировал.

 import java.util.Arrays;

public class SmallestSubarray {

    public static void main(String[] args) {
        int[] arr1 = new int[] { 1, 4, 45, 6, 0, 19 };
        int x1 = 51;
        System.out.println(Arrays.toString(arr1)   " -> "   x1);
        System.out.println(smallestSubSum(arr1, x1));

        int[] arr2 = new int[] { 7, 2, 5, 10, 1 };
        int x2 = 9;
        System.out.println(Arrays.toString(arr2)   " -> "   x2);
        System.out.println(smallestSubSum(arr2, x2));

        int[] arr3 = new int[] { 1, 4, 45, 6, 0, 19 };
        int x3 = 200;
        System.out.println(Arrays.toString(arr3)   " -> "   x3);
        System.out.println(smallestSubSum(arr3, x3));
    }

    public static int smallestSubSum(int arr[], int x) {
        if (arr == null || arr.length < 1) {
            return -1;
        }
        
        int sum = 0;
        int minCount = Integer.MAX_VALUE;
        int index = 0;

        for (int i = 0; i < arr.length; i  ) {
            sum  = arr[i];
            while (sum > x) {
                minCount = Math.min(i - index   1, minCount);
                sum -= arr[index];
                index  ;
            }
        }
        
        return (minCount == Integer.MAX_VALUE) ? -1 : minCount;
    }

}
 

Комментарии:

1. Ваш код выглядит таким простым и простым, но на выполнение у меня ушло несколько дней, я все еще работаю над тем, что я мог бы сделать или нет, чтобы добраться до вашего кода, но, тем не менее, большое вам спасибо.