Этот вопрос был задан в программном интервью Google. Я думал о двух подходах к тому же:
-
Найдите все подпоследовательности длины. При этом вычислите сумму и двух элементов и проверьте, равно ли она k. Если да, выведите "Да", иначе продолжайте поиск. Это подход грубой силы.
-
Сортировать массив в порядке убывания. Затем начните обход массива с его правого конца. Скажем, у нас есть отсортированный массив {3,5,7,10}, и мы хотим, чтобы сумма была равна 17. Мы начнем с элемента 10, index = 3, пусть обозначим индекс через 'j'. Затем включите текущий элемент и вычислите required_sum = sum - current_element. После этого мы можем выполнить двоичный или троичный поиск в массиве [0- (j-1)], чтобы найти, существует ли элемент, значение которого равно required_sum. Если мы найдем такой элемент, мы можем сломать, поскольку мы нашли подпоследовательность длины 2, сумма которой равна данной сумме. Если мы не найдем ни одного такого элемента, уменьшите индекс j и повторите вышеупомянутые шаги для получающегося подмассива length = length-1, т.е. исключив элемент с индексом 3 в этом случае.
Здесь мы рассмотрели, что массив может иметь как отрицательные, так и положительные целые числа.
Можете ли вы предложить лучшее решение, чем это? Решение DP может быть? Решение, которое может еще больше сократить время.