Popcorn Hack 1

arr = [1, 2, 3, 4, 5]

# Constant time (O(1)) - Direct access
print("O(1):", arr[2])  # 3

# Linear time (O(n)) - Loop through entire list
print("O(n):")
for num in arr:
    print(num)

O(1): 3
O(n):
1
2
3
4
5

Popcorn Hack 2

arr = [1, 2, 3]

# Unique pairs
def print_unique_pairs(arr):
    for i in range(len(arr)):
        for j in range(i + 1, len(arr)):
            print(f"({arr[i]}, {arr[j]})")

print_unique_pairs(arr)

(1, 2)
(1, 3)
(2, 3)

Popcorn Hack 3

# Question 1: Which is inefficient for large inputs?
# Answer: b) Factorial Time

# Question 2: Which can be represented by a nested loop?
# Answer: c) Quadratic Time

Homework Hacks

def time_complexity_demo(arr, complexity_type):
    if complexity_type == "constant":
        return arr[0]  # O(1)
    
    elif complexity_type == "linear":
        for item in arr:  # O(n)
            print(item)
    
    elif complexity_type == "quadratic":
        for i in arr:  # O(n²)
            for j in arr:
                print(f"({i}, {j})")

# Example test calls:
arr = [5, 10, 15, 20, 25]

print("Constant Time Result:", time_complexity_demo(arr, "constant"))
print("\nLinear Time:")
time_complexity_demo(arr, "linear")
print("\nQuadratic Time:")
time_complexity_demo(arr, "quadratic")

Constant Time Result: 5

Linear Time:
5
10
15
20
25

Quadratic Time:
(5, 5)
(5, 10)
(5, 15)
(5, 20)
(5, 25)
(10, 5)
(10, 10)
(10, 15)
(10, 20)
(10, 25)
(15, 5)
(15, 10)
(15, 15)
(15, 20)
(15, 25)
(20, 5)
(20, 10)
(20, 15)
(20, 20)
(20, 25)
(25, 5)
(25, 10)
(25, 15)
(25, 20)
(25, 25)