#!/usr/bin/python3
"""
O(n) time complexity
O(n) space complexity
# Using a loop cost O(n) time
# Using a Set cost O(1) time

# NOTE: If we'd used another loop instead of the Set, the time cost
# would be O(n^2)
"""

import unittest


def can_two_movies_fill_flight(movie_lengths, flight_length):
    """ Determine if two movie runtimes add up to the flight length"""

    # Check if list of movies is empty or have just one movie
    if len(movie_lengths) < 2:
        return False

    movies_seen = set()

    for first_movie in movie_lengths:
        possible_second_movie = flight_length - first_movie
        if possible_second_movie in movies_seen:
            return True
        # Add each movie to the set
        movies_seen.add(first_movie)
    return False




# Tests

class Test(unittest.TestCase):

    def test_short_flight(self):
        result = can_two_movies_fill_flight([2, 4], 1)
        self.assertFalse(result)

    def test_long_flight(self):
        result = can_two_movies_fill_flight([2, 4], 6)
        self.assertTrue(result)

    def test_one_movie_half_flight_length(self):
        result = can_two_movies_fill_flight([3, 8], 6)
        self.assertFalse(result)

    def test_two_movies_half_flight_length(self):
        result = can_two_movies_fill_flight([3, 8, 3], 6)
        self.assertTrue(result)

    def test_lots_of_possible_pairs(self):
        result = can_two_movies_fill_flight([1, 2, 3, 4, 5, 6], 7)
        self.assertTrue(result)

    def test_not_using_first_movie(self):
        result = can_two_movies_fill_flight([4, 3, 2], 5)
        self.assertTrue(result)

    def test_only_one_movie(self):
        result = can_two_movies_fill_flight([6], 6)
        self.assertFalse(result)

    def test_no_movies(self):
        result = can_two_movies_fill_flight([], 2)
        self.assertFalse(result)


unittest.main(verbosity=2)
