【模拟】找到最接近0的数字
题目
给你一个长度为 n
的整数数组 nums
,请你返回 nums
中最 接近 0
的数字。如果有多个答案,请你返回它们中的 最大值 。
示例 1:
|
|
示例 2:
|
|
提示:
1 <= n <= 1000
-105 <= nums[i] <= 10^5
解题思路
找绝对值最小的,若相同则选正数
代码
|
|
【枚举】买钢笔和铅笔的方案数
题目
给你一个整数 total
,表示你拥有的总钱数。同时给你两个整数 cost1
和 cost2
,分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱,去买任意数目的两种笔。
请你返回购买钢笔和铅笔的 不同方案数目 。
示例 1:
|
|
示例 2:
|
|
提示:
1 <= total, cost1, cost2 <= 10^6
解题思路
先算出最多买钢笔的数量max1,那么钢笔可买范围为[0,max1]
然后再算出铅笔可买数量范围
代码
|
|
【模拟】设计一个 ATM 机器
题目
一个 ATM 机器,存有 5
种面值的钞票:20
,50
,100
,200
和 500
美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。
取款时,机器会优先取 较大 数额的钱。
- 比方说,你想取
$300
,并且机器里有2
张$50
的钞票,1
张$100
的钞票和1
张$200
的钞票,那么机器会取出$100
和$200
的钞票。 - 但是,如果你想取
$600
,机器里有3
张$200
的钞票和1
张$500
的钞票,那么取款请求会被拒绝,因为机器会先取出$500
的钞票,然后无法取出剩余的$100
。注意,因为有$500
钞票的存在,机器 不能 取$200
的钞票。
请你实现 ATM 类:
ATM()
初始化 ATM 对象。void deposit(int[] banknotesCount)
分别存入$20
,$50
,$100
,$200
和$500
钞票的数目。int[] withdraw(int amount)
返回一个长度为5
的数组,分别表示$20
,$50
,$100
,$200
和$500
钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回[-1]
(这种情况下 不 取出任何钞票)。
示例 1:
|
|
提示:
banknotesCount.length == 5
0 <= banknotesCount[i] <= 10^9
1 <= amount <= 10^9
- 总共 最多有
5000
次withdraw
和deposit
的调用。 - 函数
withdraw
和deposit
至少各有 一次 调用。
解题思路
模拟即可
但这题的数据范围很搞啊
代码
|
|
【枚举】节点序列的最大得分
题目
给你一个 n
个节点的 无向图 ,节点编号为 0
到 n - 1
。
给你一个下标从 0 开始的整数数组 scores
,其中 scores[i]
是第 i
个节点的分数。同时给你一个二维整数数组 edges
,其中 edges[i] = [ai, bi]
,表示节点 ai
和 bi
之间有一条 无向 边。
一个合法的节点序列如果满足以下条件,我们称它是 合法的 :
- 序列中每 相邻 节点之间有边相连。
- 序列中没有节点出现超过一次。
节点序列的分数定义为序列中节点分数之 和 。
请你返回一个长度为 4
的合法节点序列的最大分数。如果不存在这样的序列,请你返回 -1
。
示例 1:
|
|
示例 2:
|
|
提示:
n == scores.length
4 <= n <= 5 * 10^4
1 <= scores[i] <= 10^8
0 <= edges.length <= 5 * 10^4
edges[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
- 不会有重边。
解题思路
思路很有意思
要找一个长度为4的链,可以先枚举中间的2个节点u和v(链中间的那条边)。为了让链的点权值之和最大,那么剩下的两个点应该选择与u相邻的,排除v以外权值最大的点a , 以及与v相邻的,排除u以外权值最大的点b。
注意特殊情况:点a和点b不能是同一个点,所以需要找出与u相邻的最大的3个点。
代码
|
|