📖 Scenario: You are analyzing a sequence of daily stock prices. You want to find the longest period during which the stock price keeps increasing day by day.
🎯 Goal: Build a program that finds the length of the longest increasing subsequence in a list of stock prices.
📋 What You'll Learn
Create a list called prices with exact values
Create a list called lis to store lengths of increasing subsequences
Use a nested for loop with variables i and j to compute lis
Print the maximum value from lis
💡 Why This Matters
🌍 Real World
Finding the longest increasing subsequence helps in analyzing trends in stock prices, sales data, or any sequence where growth periods are important.
💼 Career
Understanding LIS is useful in software development roles involving data analysis, algorithm design, and optimization problems.
Progress0 / 4 steps
1
Create the list of stock prices
Create a list called prices with these exact values: [10, 22, 9, 33, 21, 50, 41, 60]
DSA Python
Hint
Use square brackets and commas to create the list exactly as shown.
2
Initialize the LIS list
Create a list called lis with the same length as prices, where each element is 1
DSA Python
Hint
Use list multiplication to create a list of 1s with the same length as prices.
3
Compute the LIS values
Use a nested for loop with variables i and j to update lis so that for each i, if prices[i] > prices[j] and lis[i] < lis[j] + 1, then set lis[i] = lis[j] + 1
DSA Python
Hint
Use two loops: outer loop from 1 to end, inner loop from 0 to i-1. Update lis[i] if conditions are met.
4
Print the length of the longest increasing subsequence
Print the maximum value from the list lis using print(max(lis))
DSA Python
Hint
Use the max() function on lis and print the result.
Practice
(1/5)
1. What does the Longest Increasing Subsequence (LIS) problem ask for in a given list of numbers?
easy
A. The longest subsequence where each number is strictly smaller than the previous one
B. The longest subsequence where each number is equal to the previous one
C. The longest subsequence where numbers are in any order
D. The longest subsequence where each number is strictly greater than the previous one
Solution
Step 1: Understand the definition of LIS
The LIS is a subsequence where every next number is strictly greater than the previous one.
Step 2: Compare options with the definition
Only The longest subsequence where each number is strictly greater than the previous one matches the definition of LIS.
Final Answer:
The longest subsequence where each number is strictly greater than the previous one -> Option D
Quick Check:
LIS = strictly increasing subsequence [OK]
Hint: LIS means strictly increasing sequence, not equal or decreasing [OK]
Common Mistakes:
Confusing LIS with longest equal subsequence
Thinking LIS allows decreasing numbers
Assuming LIS means any order
2. Which of the following Python code snippets correctly initializes a list dp to store LIS lengths for each element in nums of length n?
easy
A. dp = [0] * n
B. dp = [1] * n
C. dp = [None] * n
D. dp = []
Solution
Step 1: Understand LIS dp initialization
Each element alone is a subsequence of length 1, so dp should start with 1s.
Step 2: Check options for correct initialization
Only dp = [1] * n initializes dp with 1s for all elements.
Final Answer:
dp = [1] * n -> Option B
Quick Check:
dp initialized with 1 for LIS length [OK]
Hint: Start dp with 1s because each element is LIS of length 1 [OK]
Common Mistakes:
Initializing dp with zeros instead of ones
Using None which causes errors in comparisons
Leaving dp empty
3. What is the output of the following code snippet?
nums = [10, 9, 2, 5, 3, 7, 101, 18]
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
print(max(dp))
Maximum dp value is 5, which is the length of LIS.
Final Answer:
5 -> Option A
Quick Check:
Longest Increasing Subsequence length = 5 [OK]
Hint: Use nested loops to update dp with max LIS length [OK]
Common Mistakes:
Forgetting to update dp[i] with max value
Mixing up indices i and j
Printing dp instead of max(dp)
4. The following code is intended to find the length of the LIS but has a bug. What is the bug?
def length_of_lis(nums):
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[j] = max(dp[j], dp[i] + 1)
return max(dp)
medium
A. dp[j] should be updated as dp[i], not dp[j]
B. The comparison should be nums[j] > nums[i]
C. dp[i] should be updated, not dp[j]
D. The function should return min(dp) instead of max(dp)
Solution
Step 1: Identify which dp index to update
In LIS, dp[i] stores the length of LIS ending at index i. So dp[i] must be updated when nums[i] > nums[j].
Step 2: Check the code's update statement
The code updates dp[j], which is incorrect. It should update dp[i].
Final Answer:
dp[i] should be updated, not dp[j] -> Option C
Quick Check:
Update dp[i] for LIS ending at i [OK]
Hint: Update dp at current index i, not previous j [OK]
Common Mistakes:
Updating dp[j] instead of dp[i]
Reversing comparison operators
Returning min(dp) instead of max(dp)
5. Given the list nums = [3, 10, 2, 1, 20], which of the following is the correct longest increasing subsequence using a binary search optimization approach?
hard
A. [3, 10, 20]
B. [2, 10, 20]
C. [1, 2, 20]
D. [3, 10, 1, 20]
Solution
Step 1: Understand binary search LIS approach
This method builds a list 'tails' where each element is the smallest possible tail of an increasing subsequence of given length.
Step 2: Trace the tails list for nums
Start with empty tails: - 3: tails = [3] - 10: tails = [3, 10] - 2: replace 3 with 2, tails = [2, 10] - 1: replace 2 with 1, tails = [1, 10] - 20: tails = [1, 10, 20] The LIS length is 3, and one valid LIS is [3, 10, 20].
Final Answer:
[3, 10, 20] -> Option A
Quick Check:
Binary search LIS = [3, 10, 20] [OK]
Hint: Binary search builds tails array for LIS length [OK]
Common Mistakes:
Confusing tails with actual subsequence
Replacing wrong elements in tails
Choosing subsequence with wrong order
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.