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 a 0-indexed 2D integer array brackets where brackets[i] = [upperi, percenti] means that the ith tax bracket has an upper bound of upperi and is taxed at a rate of percenti. The brackets are sorted by upper bound (i.e. upperi-1 < upperi for 0 < i < brackets.length).
Tax is calculated as follows:
upper0 dollars earned are taxed at a rate of percent0.upper1 - upper0 dollars earned are taxed at a rate of percent1.upper2 - upper1 dollars earned are taxed at a rate of percent2.You are given an integer income representing the amount of money you earned. Return the amount of money that you have to pay in taxes. Answers within 10-5 of the actual answer will be accepted.
Example 1:
Input: brackets = [[3,50],[7,10],[12,25]], income = 10 Output: 2.65000 Explanation: Based on your income, you have 3 dollars in the 1st tax bracket, 4 dollars in the 2nd tax bracket, and 3 dollars in the 3rd tax bracket. The tax rate for the three tax brackets is 50%, 10%, and 25%, respectively. In total, you pay $3 * 50% + $4 * 10% + $3 * 25% = $2.65 in taxes.
Example 2:
Input: brackets = [[1,0],[4,25],[5,50]], income = 2 Output: 0.25000 Explanation: Based on your income, you have 1 dollar in the 1st tax bracket and 1 dollar in the 2nd tax bracket. The tax rate for the two tax brackets is 0% and 25%, respectively. In total, you pay $1 * 0% + $1 * 25% = $0.25 in taxes.
Example 3:
Input: brackets = [[2,50]], income = 0 Output: 0.00000 Explanation: You have no income to tax, so you have to pay a total of $0 in taxes.
Constraints:
1 <= brackets.length <= 1001 <= upperi <= 10000 <= percenti <= 1000 <= income <= 1000upperi is sorted in ascending order.upperi are unique.income.Problem summary: You are given a 0-indexed 2D integer array brackets where brackets[i] = [upperi, percenti] means that the ith tax bracket has an upper bound of upperi and is taxed at a rate of percenti. The brackets are sorted by upper bound (i.e. upperi-1 < upperi for 0 < i < brackets.length). Tax is calculated as follows: The first upper0 dollars earned are taxed at a rate of percent0. The next upper1 - upper0 dollars earned are taxed at a rate of percent1. The next upper2 - upper1 dollars earned are taxed at a rate of percent2. And so on. You are given an integer income representing the amount of money you earned. Return the amount of money that you have to pay in taxes. 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
[[3,50],[7,10],[12,25]] 10
[[1,0],[4,25],[5,50]] 2
[[2,50]] 0
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2303: Calculate Amount Paid in Taxes
class Solution {
public double calculateTax(int[][] brackets, int income) {
int ans = 0, prev = 0;
for (var e : brackets) {
int upper = e[0], percent = e[1];
ans += Math.max(0, Math.min(income, upper) - prev) * percent;
prev = upper;
}
return ans / 100.0;
}
}
// Accepted solution for LeetCode #2303: Calculate Amount Paid in Taxes
func calculateTax(brackets [][]int, income int) float64 {
var ans, prev int
for _, e := range brackets {
upper, percent := e[0], e[1]
ans += max(0, min(income, upper)-prev) * percent
prev = upper
}
return float64(ans) / 100.0
}
# Accepted solution for LeetCode #2303: Calculate Amount Paid in Taxes
class Solution:
def calculateTax(self, brackets: List[List[int]], income: int) -> float:
ans = prev = 0
for upper, percent in brackets:
ans += max(0, min(income, upper) - prev) * percent
prev = upper
return ans / 100
// Accepted solution for LeetCode #2303: Calculate Amount Paid in Taxes
impl Solution {
pub fn calculate_tax(brackets: Vec<Vec<i32>>, income: i32) -> f64 {
let mut res = 0f64;
let mut pre = 0i32;
for bracket in brackets.iter() {
res += f64::from(income.min(bracket[0]) - pre) * f64::from(bracket[1]) * 0.01;
if income <= bracket[0] {
break;
}
pre = bracket[0];
}
res
}
}
// Accepted solution for LeetCode #2303: Calculate Amount Paid in Taxes
function calculateTax(brackets: number[][], income: number): number {
let ans = 0;
let prev = 0;
for (const [upper, percent] of brackets) {
ans += Math.max(0, Math.min(income, upper) - prev) * percent;
prev = upper;
}
return ans / 100;
}
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.