Happy Students
MEDIUMDescription
You are given a 0-indexed integer array nums of length n where n is the total number of students in the class. The class teacher tries to select a group of students so that all the students remain happy.
The ith student will become happy if one of these two conditions is met:
- The student is selected and the total number of selected students is strictly greater than
nums[i]. - The student is not selected and the total number of selected students is strictly less than
nums[i].
Return the number of ways to select a group of students so that everyone remains happy.
Example 1:
Input: nums = [1,1] Output: 2 Explanation: The two possible ways are: The class teacher selects no student. The class teacher selects both students to form the group. If the class teacher selects just one student to form a group then the both students will not be happy. Therefore, there are only two possible ways.
Example 2:
Input: nums = [6,0,3,3,6,7,2,7] Output: 3 Explanation: The three possible ways are: The class teacher selects the student with index = 1 to form the group. The class teacher selects the students with index = 1, 2, 3, 6 to form the group. The class teacher selects all the students to form the group.
Constraints:
1 <= nums.length <= 1050 <= nums[i] < nums.length
Approaches
Checkout 2 different approaches to solve Happy Students. Click on different approaches to view the approach and algorithm in detail.
Brute Force by Checking All Subsets
This approach exhaustively checks every possible group of students. A group can be represented as a subset of the students. There are 2^n possible subsets, where n is the number of students. For each subset, we determine its size k and then verify if every student (both in the subset and not in the subset) is happy according to the given conditions.
Algorithm
- Initialize a counter
waysto 0. - Generate every possible subset of students. There are
2^nsuch subsets. - For each subset
S:- Let
kbe the size of the subsetS. - Assume the group is valid (
all_happy = true). - Iterate through all
nstudents:- If a student
iis inS(selected), check ifk > nums[i]. If not, the group is invalid (all_happy = false), and we can stop checking this subset. - If a student
iis not inS(not selected), check ifk < nums[i]. If not, the group is invalid (all_happy = false), and we can stop checking this subset.
- If a student
- If
all_happyremains true after checking all students, incrementways.
- Let
- Return
ways.
The algorithm iterates through all 2^n subsets of the n students. This can be done using recursion or iteration with bit manipulation (where the i-th bit of a number from 0 to 2^n - 1 represents whether student i is selected).
For each subset S:
- Calculate the size of the group,
k = |S|. - Initialize a flag
all_happy = true. - Iterate through all
nstudents fromi = 0ton-1:- If student
iis in the subsetS(selected): check ifk > nums[i]. If not, setall_happy = falseand break. - If student
iis not in the subsetS(not selected): check ifk < nums[i]. If not, setall_happy = falseand break.
- If student
- If
all_happyis still true after checking all students, it means this subset forms a valid group, so we increment our total count of ways.
After checking all 2^n subsets, the final count is the answer.
Complexity Analysis
Pros and Cons
- Conceptually simple and directly follows the problem definition.
- Extremely inefficient due to its exponential time complexity.
- Not feasible for the given constraints where
ncan be up to10^5.
Code Solutions
Checking out 3 solutions in different languages for Happy Students. Click on different languages to view the code.
class Solution {
public
int countWays(List<Integer> nums) {
Collections.sort(nums);
int n = nums.size();
int ans = 0;
for (int i = 0; i <= n; i++) {
if ((i == 0 || nums.get(i - 1) < i) && (i == n || nums.get(i) > i)) {
ans++;
}
}
return ans;
}
}
Video Solution
Watch the video walkthrough for Happy Students
Similar Questions
5 related questions you might find useful
Algorithms:
Patterns:
Data Structures:
Subscribe to Scale Engineer newsletter
Learn about System Design, Software Engineering, and interview experiences every week.
No spam, unsubscribe at any time.