Возвращает максимальное значение целого числа по индексу k в массиве

Этот вопрос был задан во время собеседования в Microsoft на должность стажера, я понятия не имею, как к этому подступиться.

Массив состоит из n положительных целых чисел, сумма всех элементов в массиве не превышает max_sum, абсолютная разница между любыми двумя последовательными элементами в массиве не превышает 1. Возвращает максимальное значение целого числа по индексу k в массиве.

Input : n = 3, max_sum = 7, k = 1
Output: 3
In this case let's say array is [2,3,2]

Input: n = 4, max_sum = 6, k = 2
output = 2
In this case let's say array is [1,1,2,1]
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
751
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это метод грубой силы. Лучшим решением было бы вычислить значения, но я оставлю это на ваше усмотрение. Это ваша задача получить работу, верно?

Input: n = 7, max_sum = 34, k = 4
  1. Установите все значения на 0.

    //                    ↓ k
    array = { 0, 0, 0, 0, 0, 0, 0 }, sum = 0
    
  2. Поскольку нам нужно максимальное значение k с наименьшей суммой, просто увеличьте значение до 1.

    //                    ↓ k
    array = { 0, 0, 0, 0, 1, 0, 0 }, sum = 1 (+1)
    
  3. Поскольку последовательные элементы должны быть отделены друг от друга не более чем на 1, когда мы снова увеличиваем значение в k, нам также нужно увеличивать соседние значения.

    //                    ↓ k
    array = { 0, 0, 0, 1, 2, 1, 0 }, sum = 4 (+3)
    
  4. Повторяйте, неоднократно.

    //                    ↓ k
    array = { 0, 0, 1, 2, 3, 2, 1 }, sum = 9 (+5)
    
    array = { 0, 1, 2, 3, 4, 3, 2 }, sum = 15 (+6)
    
    array = { 1, 2, 3, 4, 5, 4, 3 }, sum = 22 (+7)
    
    array = { 2, 3, 4, 5, 6, 5, 4 }, sum = 29 (+7)
    
  5. Мы не можем повторить еще раз, потому что если бы мы это сделали, то получили бы sum = 29 + 7 = 36, а это превысило бы max_sum = 34.

Результат: Максимальное значение в k равно 6.

Есть много способов распределить оставшиеся 5 баллов, чтобы получить точную сумму, но показать решение с точной суммой не является целью, поэтому нам не нужно ничего делать с 5 дополнительными баллами.

Определим a как среднее значение массива:

a = max_sum / n

Найдем максимум при k = 0:

max(0) = a + n/2

В этом случае все остальные значения массива будут уменьшаться, поэтому последнее значение будет

a - n/2

для k = 1 мы видим, что максимум не будет превышать max(0)-1, поэтому

max(1) = a + n/2 - 1

и так далее, пока k = n/2. для k > n/2 максимальное значение увеличится до a + n/2 при k = n-1, поэтому мы имеем V-образную кривую с минимумом при k=n/2, равным a.

Осталось только правильно обработать граничные условия, нечетные или четные n и так далее. Надеюсь, вы уловили идею.

«В алгоритме нет необходимости» Википедия определяет алгоритм как «конечную последовательность четко определенных, реализуемых компьютером инструкций». Merriam-Webster определяет его как «процедуру решения математической задачи (например, нахождения наибольшего общего делителя) за конечное число шагов, которая часто включает повторение операции». Обратите внимание, что повторение не требуется. Таким образом, a = max_sum / n — это алгоритм. Любая математическая формула, реализуемая компьютером, является алгоритмом.

Andreas 15.12.2020 07:54

Хорошо спасибо! Я имел в виду, что нет необходимости в итерациях или грубой силе :)

Nyavro 15.12.2020 07:59

Тогда вы должны отредактировать ответ и сказать это вместо этого.

Andreas 15.12.2020 08:36

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