Вопрос к алгоритму: задача тройки Ню Ню

Тройная задача Ню Ню_Вопрос Ню Ке Ba_Nu Ke.com

описывать

Животное Ню Ню — отважный искатель приключений, который исследует загадочный остров. На острове много сокровищ, но сокровища спрятаны в ряде цифр. Ню Ню нашел целочисленный массив  numsи полагал, что в этом массиве есть какие-то особые тройки, отвечающие следующим условиям:

  • Сумма троек равна 0.
  • Элементы тройки не могут повторяться.
  • Ниуниу хочет вернуть все тройки, соответствующие условиям, в лексикографическом порядке.

Пожалуйста, помогите Ниуниу решить эту проблему. Разработайте функцию  findTriplets, которая получает целочисленный массив  nums в качестве параметра и возвращает двумерный целочисленный массив, представляющий тройки, соответствующие условиям. Все тройки возвращаются в лексикографическом порядке.

Пример 1

входить:

[-1,0,1,2,-1,-4]

Скопируйте возвращаемое значение:

[[-1,-1,2],[-1,0,1]]

копировать

Пример 2

входить:

[2, -1, 1, -2, 0, -2]

Скопируйте возвращаемое значение:

[[-2,0,2],[-1,0,1]]

копировать

Примечание:

  • 3 <= числа.длина <= 3000
  • Диапазон целых чисел в массиве: [-10^5, 10^5]

Идея решения проблемы: сначала отсортировать, а затем напрямую выполнить три цикла for. Однако во время конкретного процесса операции необходимо удалить повторяющиеся тройки, поэтому добавляются два решения:

if i > 0 and nums[i] == nums[i - 1]:

if j > i + 1 and nums[j] == nums[j - 1]:

Полный код алгоритма: # 31ms, 6392КБ

class Solution:
    def findTriplets(self, nums):
        # [-2, -2, -1, 0, 1, 2]
        nums = sorted(nums)
        n = len(nums)
        ans_set = []
        for i in range(n - 2):
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            if nums[i] > 0:
                break
            j = i + 1
            while j < n - 1:
                if j > i + 1 and nums[j] == nums[j - 1]:
                    j += 1
                    continue
                if (nums[i] + nums[j]) > 0:
                    break
                for k in range(j + 1, n):
                    if nums[i] + nums[j] + nums[k] > 0:
                        break
                    elif nums[i] + nums[j] + nums[k] == 0:
                        ans_set.append([nums[i], nums[j], nums[k]])
                        break
                j += 1

        return ans_set


if __name__ == '__main__':
    sol = Solution()
    # print(sol.findTriplets([-1, 0, 1, 2, -1, -4]))
    # print(sol.findTriplets([2, -1, 1, -2, 0, -2]))
    print(sol.findTriplets([0, 0, 0, 0, 0, 0]))

おすすめ

転載: blog.csdn.net/m0_37738114/article/details/133255600