文章目录
2303. 计算应缴税款总额
LeetCode: 2303. 计算应缴税款总额
简单 \color{#00AF9B}{简单} 简单
给你一个下标从 0 开始的二维整数数组
brackets
,其中brackets[i] = [upper_i, percent_i]
,表示第i
个税级的上限是upper_i
,征收的税率为percent_i
。税级按上限 从低到高排序(在满足0 < i < brackets.length
的前提下,upper_(i-1) < upper_i
)。税款计算方式如下:
- 不超过
upper_0
的收入按税率percent_0
缴纳- 接着
upper_1 - upper_0
的部分按税率percent_1
缴纳- 然后
upper_2 - upper_1
的部分按税率percent_2
缴纳- 以此类推
给你一个整数
income
表示你的总收入。返回你需要缴纳的税款总额。与标准答案误差不超10^(-5)
的结果将被视作正确答案。
示例 1:
输入:brackets = [[3,50],[7,10],[12,25]], income = 10
输出:2.65000
解释:
前 $3 的税率为 50% 。需要支付税款 $3 * 50% = $1.50 。
接下来 $7 - $3 = $4 的税率为 10% 。需要支付税款 $4 * 10% = $0.40 。
最后 $10 - $7 = $3 的税率为 25% 。需要支付税款 $3 * 25% = $0.75 。
需要支付的税款总计 $1.50 + $0.40 + $0.75 = $2.65 。
示例 2:
输入:brackets = [[1,0],[4,25],[5,50]], income = 2
输出:0.25000
解释:
前 $1 的税率为 0% 。需要支付税款 $1 * 0% = $0 。
剩下 $1 的税率为 25% 。需要支付税款 $1 * 25% = $0.25 。
需要支付的税款总计 $0 + $0.25 = $0.25 。
示例 3:
输入:brackets = [[2,50]], income = 0
输出:0.00000
解释:
没有收入,无需纳税,需要支付的税款总计 $0 。
提示:
1 <= brackets.length <= 100
1 <= upperi <= 1000
0 <= percenti <= 100
0 <= income <= 1000
upper_i
按递增顺序排列upper_i
中的所有值 互不相同- 最后一个税级的上限大于等于
income
方法1:模拟
我们在遍历数组 brackets
计算税款时,需要记录 “上一次” 的税款门限,记为 pre_threshold
,其初值为 0 ;则 “这一次” 的税款计算区间即为 [pre_threshold, upper_i]
。
将 upper_i
减去 pre_threshold
得到间隔,记为 interval
。
- 当剩余的收入
income
能够覆盖这段间隔,就用interval
去计算这次的结果,再将income
减去interval
得到剩余收入,进行下一次计算。 - 当剩余收入不能覆盖这段间隔,就用剩余的收入去计算结果,然后退出对数组
brackets
的遍历,返回结果。
#include <vector>
using namespace std;
class Solution
{
public:
double calculateTax(const vector<vector<int>> &brackets, int income)
{
if (income == 0)
return 0.0;
double tax = 0.0;
int pre_threshold = 0;
for (const vector<int> &bracket : brackets)
{
if (const int interval = bracket[0] - pre_threshold; interval <= income)
{
tax += interval * bracket[1];
income -= interval;
}
else
{
tax += income * bracket[1];
break;
}
pre_threshold = bracket[0];
}
return tax / 100.0;
}
};
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n)。其中,
n
为数组brackets
的长度。 -
空间复杂度: O ( 1 ) O(1) O(1)。没有用到额外的、大小与输入数据有关的变量,因此仅占用常数的额外空间。
参考结果
Accepted
227/227 cases passed (8 ms)
Your runtime beats 94.92 % of cpp submissions
Your memory usage beats 54.24 % of cpp submissions (13 MB)