Разбор задачи: Нахождение среднего индекса в массиве

Предложенный нами код решения:

 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

Функция перебирает массив с помощью цикла. На каждой итерации:

  1. Вычисляется сумма элементов справа:

    Здесь:

    • total_sum — сумма всех элементов массива.
    • left_sum — сумма всех элементов, находящихся слева от текущего индекса.
    • num — значение текущего элемента, которое нужно исключить из общей суммы.
  2. Сравниваются суммы слева и справа:
    Если они равны, функция немедленно возвращает текущий индекс i.
  3. Обновление суммы слева:
    После проверки, текущий элемент добавляется к left_sum, чтобы использовать эту сумму на следующей итерации.

Пример:
Для массива nums = [1, 2, 3, 4, 6] на итерации 3:

  • left_sum = 1 + 2 + 3 = 6
  • right_sum = 16 - 6 - 4 = 6
    Суммы совпадают, значит, индекс 3 возвращается.

4. Возврат результата

Если цикл завершился и ни один индекс не подошел, возвращается -1:

return -1

Пример работы функции

Рассмотрим массив nums = [1, 2, 3, 4, 6]:

  1. Итерация 0:
    • left_sum = 0, right_sum = 16 - 0 - 1 = 15
    • Не совпадают, продолжаем.
  2. Итерация 1:
    • left_sum = 1, right_sum = 16 - 1 - 2 = 13
    • Не совпадают, продолжаем.
  3. Итерация 2:
    • left_sum = 1 + 2 = 3, right_sum = 16 - 3 - 3 = 10
    • Не совпадают, продолжаем.
  4. Итерация 3:
    • left_sum = 1 + 2 + 3 = 6, right_sum = 16 - 6 - 4 = 6
    • Совпадают, возвращается индекс 3.

Результат:

findMiddleIndex([1, 2, 3, 4, 6])  # Возвращает 3

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии