LeetCode 第 76 场双周赛 题解及思路
6060. 找到最接近 0 的数字
给你一个长度为
n
的整数数组nums
,请你返回nums
中最 接近0
的数字。如果有多个答案,请你返回它们中的最大值。
提示:
1 <= n <= 1000
10^5 <= nums[i] <= 10^5
简单翻译一下题目意思,找出数组中绝对值最小的数,如果绝对值相同则优先 正数。
数据范围允许我们用快排排序,绝对值大小作为第一优先级,正负作为第二优先级。时间复杂度为 O(logN)
,空间复杂度为 O(1)
。
也可以仅用一个变量 ans
来存储结果,遍历数组根据优先级规则来更新 ans
的值即可。时间复杂度为 O(N)
,空间复杂度为 O(1)
。
for (const int& num : nums)
if (abs(num) < abs(ans) || abs(num) == abs(ans) && num > ans) ans = num;
完整代码见 GitHub。
6061. 买钢笔和铅笔的方案数
给你一个整数
total
,表示你拥有的总钱数。同时给你两个整数cost1
和cost2
,分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱,去买任意数目的两种笔。请你返回购买钢笔和铅笔的 不同方案数目。
提示:
1 <= total, cost1, cost2 <= 10^6
这道题怎么对得起力扣 中等 难度,我是怎么也想不通。
思路很简单,只要确定了钢笔的数量就能直接确定铅笔的 最大数量。因此,我们从 0 开始遍历买钢笔的数量,然后累加买铅笔的方案数(即买铅笔的 最大数量 + 1)即可。
注意数据范围超过了 int32
,以及边界值 0 的处理。
long long ans = 0;
for (int i = 0; i * cost1 <= total; i++)
ans += (long long)