(Легкий вопрос LeetCode)
Учитывая массив nums
. Мы определяем текущую сумму массива как runningSum[i] = sum(nums[0]…nums[i])
.
Вернуть текущую сумму nums
.
Пример 1:
Input: nums = [1,2,3,4] Output: [1,3,6,10] Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].
Пример 2:
Input: nums = [1,1,1,1,1] Output: [1,2,3,4,5] Explanation: Running sum is obtained as follows: [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1].
Пример 3:
Input: nums = [3,1,2,10,1] Output: [3,4,6,16,17]
Ограничения:
1 <= nums.length <= 1000
-10^6 <= nums[i] <= 10^6
Теперь давайте сначала обсудим, что вы подразумеваете под текущей суммой?
Например, давайте сначала возьмем пример, nums = [1,2,3], и давайте использовать другой вектор an для хранения результатов.
Таким образом, первый элемент остается таким же, поэтому ans[0] = nums[0], но для следующего элемента ans[1] = nums[0]+nums[1] , ans[2] = nums[0]+nums[ 1]+nums[2] и так далее… Надеюсь, вы уже поняли концепцию.
Существуют различные подходы, с помощью которых можно решить этот вопрос. Давайте посмотрим, как выглядит решение грубой силы:
Подход грубой силы
Здесь я буду использовать другой вектор для хранения ответов, что означает, что я использую дополнительное пространство O (n), поскольку я буду проходить через массив, временная сложность также будет равна O (n). Но возникает вопрос, как я буду рассчитывать текущую сумму? Он прост и заключается в следующем.
Прежде всего, ans[0] = nums[0], что верно только для первого элемента, поэтому я уже скопировал весь массив nums в свой массив ans, поэтому, кроме первого элемента, я переопределю все остальные элементы, присутствующие в ans множество.
ans[1] = ans[0] + nums[1] , это отношение, которое оно будет иметь. объясню почему? Как мы видели выше, нам требуется предыдущий элемент для непрерывной суммы, поскольку формула выглядит как a[m] = a[0]+a[1]+…+a[m].
ans[2] = ans[1]+nums[2] , что означает, что здесь ans[1] = ans[0]+ans[1] из приведенного выше, поэтому ans[2] = ans[0]+ans[ 1]+числа[2]. Я надеюсь, что это проясняет, почему я использую приведенную выше формулу, nums[2] представляет второй элемент, а ans[1] представляет собой текущую сумму от индекса 0 до 1. Вот и весь подход к кодированию этого решения.
Поэтому и временная сложность, и пространственная сложность равны O(n) только при использовании описанного выше подхода.
Теперь давайте проверим, используя концепцию, о которой мы подумали, а позже закодируем ее.
числа=[1,2,3,4] , ответы = [1,2,3,4]
ans[1] = ans[0] + nums[1] = 1 + 2 = 3 ; ответ = [1,3,3,4]
ans[2] = ans[1]+ nums[2] = 3 + 3 = 6 ; ответ = [1,3,6,4]
ans[3] = ans[2] + nums[3] = 6 + 4 = 10 ; ответ = [1,3,6,10]
Итак, теперь наш окончательный ответ становится ans = [1,3,6,10]
Теперь код:
class Solution { public: vector<int> runningSum(vector<int>& nums) { // brute force approach // tc - O(n) & sc - O(n) vector<int>ans; ans = nums; for(int i=1;i<nums.size();i++) { ans[i] = ans[i-1]+nums[i]; } return ans; } };
Итак, теперь я надеюсь, что это ясно для вас. Попробуйте повторить, используя еще несколько примеров, если вы не можете ясно понять.
Оптимизированный подход
Как же должен выглядеть оптимизированный подход? Есть идеи? Ну, я думаю, мы можем уменьшить сложность пространства, что скажешь? Можем ли мы сделать сложность пространства постоянной, то есть O (1), возможно ли это? Я думаю, да, это так. Давайте посмотрим, как ниже:
Взяв тот же пример: nums = [1,2,3,4]
так что nums[0] остается прежним, как насчет следующего элемента?
числа [1] = числа [0] + числа [1] = 1 + 2 = 3 ; числа = [1,3,3,4]
числа [2] = числа [1] + числа [2] = 3 + 3 = 6 ; числа = [1,3,6,4]
числа [3] = числа [2] + числа [3] = 6 + 4 = 10 ; числа = [1,3,6,10]
и это наш окончательный ответ. Но как сформулировать наш ответ в терминах i при переборе массива, это просто, для каждого i мы должны найти элемент с i-м и (i-1)-м индексом, поэтому nums[i] = nums [i-1]+nums[i], где i≥1.
Кажется довольно легко, верно? Как только вы поймете концепцию, все вопросы покажутся вам проще. Теперь давайте закодируем его:
class Solution { public: vector<int> runningSum(vector<int>& nums) { for(int i=1;i<nums.size();i++) { nums[i]=nums[i-1]+nums[i]; } return nums; } };
Таким образом, наша временная сложность – O(n), а пространственная – O(1).
Надеемся, что эта статья поможет вам четко понять концепции. А до тех пор продолжайте программировать и решать, потому что последовательность всегда является ключом к достижению целей в жизни! Удачи 🙌💻
Поскольку вам понравилось читать мой блог, почему бы не купить мне кофе и не поддержать мою работу здесь!! https://www.buymeacoffee.com/sukanyabharati ☕