Думаю, это типичный вопрос двоичного поиска. Я не думаю, что даже ваше решение пройдет «Онлайн-судью» из-за большой временной сложности (и ваш анализ может быть верным). Но вы можете проверить свое решение.
В условиях собеседования все, что они ищут, - это самый эффективный алгоритм, который обычно можно найти на панели обсуждения. Они даже не хотят ничего знать об алгоритмах грубой силы, если, может быть, вопрос не будет слишком сложным или что-то в этом роде.
Вероятно, это будет время O (N Log N) и постоянная память:
Python
from typing import List
class Solution:
def shipWithinDays(self, weights: List[int], d: int) -> int:
lo, hi = max(weights), sum(weights)
while lo < hi:
mid = lo + ((hi - lo) >> 1) # or mid = (lo + hi) // 2 || mid = lo + (hi - lo) // 2
cur, required = 0, 1
for weight in weights:
if cur + weight > mid:
required += 1
cur = 0
cur += weight
if required > d:
lo = -~mid # simply lo = mid + 1
else:
hi = mid
return lo
Java
class Solution {
public int shipWithinDays(int[] weights, int d) {
int lo = 0;
int hi = 0;
for (int weight : weights) {
lo = Math.max(lo, weight);
hi += weight;
}
while (lo < hi) {
int mid = lo + ((hi - lo) >> 1);
int required = 1;
int cur = 0;
for (int weight : weights) {
if (cur + weight > mid) {
required += 1;
cur = 0;
}
cur += weight;
}
if (required > d)
lo = -~mid;
else
hi = mid;
}
return lo;
}
}
C ++
class Solution {
public:
int shipWithinDays(vector<int> &weights, int d) {
int lo = 0;
int hi = INT_MAX;
for (int weight : weights)
lo = max(lo, weight);
while (lo < hi) {
int mid = lo + ((hi - lo) >> 1);
int required = 1;
int cur = 0;
for (int index = 0; index < weights.size() && required <= d; cur += weights[index++])
if (cur + weights[index] > mid)
cur = 0, required++;
if (required > d)
lo = -~mid;
else
hi = mid;
}
return lo;
}
};
Я бы посоветовал сосредоточить внимание на чистом коде во время интервью. Скорее всего, вам не нужно писать T (N). Вы можете просто сказать интервьюеру, какова ваша пространственно-временная сложность. Во время собеседования акцентировать внимание на «большом» обычно не стоит, потому что у них могут быть разные мнения, не говоря уже о том, что они ищут практического анализа «большого».
Я бы посоветовал поскорее пройти через био-часть. Если бы у интервьюера были дополнительные вопросы, вы можете просто расширить их.
Если ваша сила био-о, возможно, вы сможете потратить на это немного времени. Обычно наибольшее значение имеют алгоритм, структура данных и дизайн / архитектура системы.
Ссылка
Это решение lee215 , которое, кстати, разрабатывает некоторые из этих вопросов LeetCode и обычно размещает наиболее эффективные решения на панели обсуждения LeetCode.
LeetCode 1011