Difficulty | Source | Tags | ||
---|---|---|---|---|
Easy |
160 Days of Problem Solving |
|
The problem can be found at the following link: Problem Link
Given an array of positive integers arr[]
, return the second largest element from the array. If the second largest element doesn't exist, return -1
.
Note: The second largest element should not be equal to the largest element.
Input:
arr[] = [12, 35, 1, 10, 34, 1]
Output:
34
Explanation:
The largest element of the array is 35, and the second largest element is 34.
Input:
arr[] = [10, 5, 10]
Output:
5
Explanation:
The largest element of the array is 10, and the second largest element is 5.
Input:
arr[] = [10, 10, 10]
Output:
-1
Explanation:
The largest element of the array is 10, and there is no distinct second largest element.
$(2 \leq \text{arr.size()} \leq 10^5)$ $(1 \leq \text{arr[i]} \leq 10^5)$
-
Tracking Largest and Second Largest:
- Initialize two variables,
first
andsecond
, to the smallest possible values. - Traverse through the array:
- If the current element is greater than
first
, updatesecond
tofirst
, and then setfirst
to the current element. - If the current element is less than
first
but greater thansecond
, updatesecond
.
- If the current element is greater than
- If no valid second largest element is found, return
-1
.
- Initialize two variables,
-
Edge Cases:
- If all elements are the same, return
-1
. - If the array has only two distinct elements, return the smaller of the two if it’s not equal to the largest.
- If all elements are the same, return
- Expected Time Complexity: O(n), where
n
is the number of elements in the array. The algorithm makes a single pass through the array to determine the largest and second largest elements. - Expected Auxiliary Space Complexity: O(1), as we only use a constant amount of additional space to store
first
andsecond
.
class Solution {
public:
int getSecondLargest(const std::vector<int>& arr) {
int first = INT_MIN, second = INT_MIN;
for (int num : arr) {
if (num > first) {
second = first;
first = num;
} else if (num > second && num < first) {
second = num;
}
}
return second == INT_MIN ? -1 : second;
}
};
class Solution {
public:
int getSecondLargest(std::vector<int>& arr) {
std::sort(arr.rbegin(), arr.rend());
int first = arr[0];
for (int num : arr) {
if (num < first) return num;
}
return -1;
}
};
class Solution {
public int getSecondLargest(int[] arr) {
int first = Integer.MIN_VALUE;
int second = Integer.MIN_VALUE;
for (int num : arr) {
if (num > first) {
second = first;
first = num;
} else if (num > second && num < first) {
second = num;
}
}
return second == Integer.MIN_VALUE ? -1 : second;
}
}
class Solution:
def getSecondLargest(self, arr):
first = float('-inf')
second = float('-inf')
for num in arr:
if num > first:
second = first
first = num
elif num > second and num < first:
second = num
return -1 if second == float('-inf') else second
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐