import random

#############################################################################################
def find_min_1(lst_obj):
    """Функция должна обеспечивать поиск минимального значения для списка.
    В основе алгоритма сравнение каждого числа со всеми другими элементами списка.
    Сложность: !!!. O(n) * (O(n) + O(1)) = O(n^2) - квадратичная.
    можно было конечно и два вложенных цикла с пееркрестным сравнением каждого элемента,
    но с привлечением агрегирующей функции показалось "интереснее"
    for el1 in lst_obj:
        is_min = True
        for el2 in lst_obj:
            if el1 > el2:
                is_min = False
        if is_min == True:
            return el1
    """
    for j in range(len(lst_obj)):               # !!! O(n)
        if lst_obj[j] <= min(lst_obj[j+1:]):    # !!! срез O(n) + min O(n) = O(n), но вложенный!!!
            return lst_obj[j]                   # !!! O(1)


#############################################################################################
def find_min_2(lst_obj):
    """Функция должна обеспечивать поиск минимального значения для списка.
    Сложность такого алгоритма: O(n) - линейная.
    """
    min_el = 0                              # !!! O(1)
    for i in range(len(lst_obj)):           # !!! O(n)
        if i == 1 or min_el > lst_obj[i]:   # !!! O(1)
            min_el = lst_obj[i]             # !!! O(1)
    return min_el                           # !!! O(1)

#############################################################################################

lst = random.sample(range(-1000, 1000), 20)         # Заполним список 20 элементами в интервале ...
# lst = [random.randint(0,1000) for i in range(20)]
# print(len(lst))
# print(lst)
print(find_min_1(lst))
print(find_min_2(lst))