Программа курса:
Разбор задачи: Нахождение среднего индекса в массиве
Предложенный нами код решения:
def findMiddleIndex(nums):
"""
Находит самый левый индекс, при котором сумма элементов слева равна сумме элементов справа.
:param nums: Список целых чисел
:return: Индекс middleIndex или -1, если такого индекса нет
"""
total_sum = sum(nums) # Сумма всех элементов массива
left_sum = 0 # Сумма элементов слева от текущего индекса
for i, num in enumerate(nums):
# Вычисляем сумму справа как разницу между общей суммой и текущей позицией
right_sum = total_sum - left_sum - num
if left_sum == right_sum:
return i
left_sum += num # Обновляем сумму слева
return -1
Данная функция ищет индекс в массиве, при котором сумма элементов слева от него равна сумме элементов справа. Если такого индекса нет, возвращается -1. Рассмотрим алгоритм по шагам.
1. Суммируем все элементы массива
total_sum = sum(nums)
Сначала вычисляется сумма всех элементов массива nums и сохраняется в переменной total_sum. Это нужно, чтобы быстро находить сумму элементов справа от текущего индекса, не выполняя лишних операций.
Пример:
Для массива nums = [1, 2, 3, 4, 6]:
total_sum = 1 + 2 + 3 + 4 + 6 = 16
2. Инициализация суммы слева
left_sum = 0
На начальном этапе сумма элементов слева от текущего индекса равна 0, так как до первого элемента массива ничего нет.
3. Перебор элементов массива
for i, num in enumerate(nums):
right_sum = total_sum - left_sum - num
if left_sum == right_sum:
return i
left_sum += num
Функция перебирает массив с помощью цикла. На каждой итерации:
Вычисляется сумма элементов справа:

Здесь:
total_sum— сумма всех элементов массива.left_sum— сумма всех элементов, находящихся слева от текущего индекса.num— значение текущего элемента, которое нужно исключить из общей суммы.
- Сравниваются суммы слева и справа:
Если они равны, функция немедленно возвращает текущий индексi. - Обновление суммы слева:
После проверки, текущий элемент добавляется кleft_sum, чтобы использовать эту сумму на следующей итерации.
Пример:
Для массива nums = [1, 2, 3, 4, 6] на итерации 3:
left_sum = 1 + 2 + 3 = 6right_sum = 16 - 6 - 4 = 6
Суммы совпадают, значит, индекс3возвращается.
4. Возврат результата
Если цикл завершился и ни один индекс не подошел, возвращается -1:
return -1
Пример работы функции
Рассмотрим массив nums = [1, 2, 3, 4, 6]:
- Итерация 0:
left_sum = 0,right_sum = 16 - 0 - 1 = 15- Не совпадают, продолжаем.
- Итерация 1:
left_sum = 1,right_sum = 16 - 1 - 2 = 13- Не совпадают, продолжаем.
- Итерация 2:
left_sum = 1 + 2 = 3,right_sum = 16 - 3 - 3 = 10- Не совпадают, продолжаем.
- Итерация 3:
left_sum = 1 + 2 + 3 = 6,right_sum = 16 - 6 - 4 = 6- Совпадают, возвращается индекс
3.
Результат:
findMiddleIndex([1, 2, 3, 4, 6]) # Возвращает 3