Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on array fundamentals.
You are given an array of unique integers salary where salary[i] is the salary of the ith employee.
Return the average salary of employees excluding the minimum and maximum salary. Answers within 10-5 of the actual answer will be accepted.
Example 1:
Input: salary = [4000,3000,1000,2000] Output: 2500.00000 Explanation: Minimum salary and maximum salary are 1000 and 4000 respectively. Average salary excluding minimum and maximum salary is (2000+3000) / 2 = 2500
Example 2:
Input: salary = [1000,2000,3000] Output: 2000.00000 Explanation: Minimum salary and maximum salary are 1000 and 3000 respectively. Average salary excluding minimum and maximum salary is (2000) / 1 = 2000
Constraints:
3 <= salary.length <= 1001000 <= salary[i] <= 106salary are unique.Problem summary: You are given an array of unique integers salary where salary[i] is the salary of the ith employee. Return the average salary of employees excluding the minimum and maximum salary. Answers within 10-5 of the actual answer will be accepted.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
[4000,3000,1000,2000]
[1000,2000,3000]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1491: Average Salary Excluding the Minimum and Maximum Salary
class Solution {
public double average(int[] salary) {
int s = 0;
int mi = 10000000, mx = 0;
for (int v : salary) {
mi = Math.min(mi, v);
mx = Math.max(mx, v);
s += v;
}
s -= (mi + mx);
return s * 1.0 / (salary.length - 2);
}
}
// Accepted solution for LeetCode #1491: Average Salary Excluding the Minimum and Maximum Salary
func average(salary []int) float64 {
s := 0
mi, mx := 10000000, 0
for _, v := range salary {
s += v
mi = min(mi, v)
mx = max(mx, v)
}
s -= (mi + mx)
return float64(s) / float64(len(salary)-2)
}
# Accepted solution for LeetCode #1491: Average Salary Excluding the Minimum and Maximum Salary
class Solution:
def average(self, salary: List[int]) -> float:
s = sum(salary) - min(salary) - max(salary)
return s / (len(salary) - 2)
// Accepted solution for LeetCode #1491: Average Salary Excluding the Minimum and Maximum Salary
impl Solution {
pub fn average(salary: Vec<i32>) -> f64 {
let n = salary.len() as i32;
let mut min = i32::MAX;
let mut max = i32::MIN;
let mut sum = 0;
for &num in salary.iter() {
min = min.min(num);
max = max.max(num);
sum += num;
}
f64::from(sum - min - max) / f64::from(n - 2)
}
}
// Accepted solution for LeetCode #1491: Average Salary Excluding the Minimum and Maximum Salary
function average(salary: number[]): number {
let max = -Infinity;
let min = Infinity;
let sum = 0;
for (const v of salary) {
sum += v;
max = Math.max(max, v);
min = Math.min(min, v);
}
return (sum - max - min) / (salary.length - 2);
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.