- 博客(17)
- 收藏
- 关注
原创 C++有序数组中的单一元素
二分查找的目标是找到满足 nums[x]=nums[x+1] 的最小的偶数下标 x,则下标 x 处的元素是只出现一次的元素。初始时,二分查找的左边界是 0,右边界是数组的最大偶数下标,由于数组的长度是奇数,因此数组的最大偶数下标等于数组的长度减 1。每次取左右边界的平均值 mid 作为待判断的下标,如果 mid 是奇数则将 mid 减 1,确保 mid 是偶数,比较 nums[mid] 和 nums[mid+1] 是否相等,如果相等则 mid<x,调整左边界,否则 mid≥x,调整右边界。
2024-11-10 21:54:31
246
原创 C++设计相邻元素求和服务
思路:由于询问时给定的是元素而不是元素在二维数组中的位置,因此在初始化时,我们可以使用一个哈希表 pos 存储每一个元素所在的位置:pos 中的每个键表示一个元素,对应的值是一个二元组,表示其在二维数组中的位置。同时,在初始化时,我们存储给定的二维数组 grid 的一份拷贝。这样一来,在查询操作 adjacentSum(value) 和 diagonalSum(value) 中,我们首先通过 pos 获取 value 的位置,随后根据查询的类型,返回四个相邻元素的和即可。
2024-11-09 14:47:33
105
原创 长度为 K 的子数组的能量值 II
由于子数组如果满足连续上升,此时相邻元素的差值一定为 1,在遍历数组的同时,用一个计数器 cnt 统计以当前索引 i 为结尾时连续上升的元素个数,初始化 cnt=0,此时:如果满足 i=0 或者 nums[i]−nums[i−1]=1 时,此时 cnt=cnt+1,即在 nums[i−1] 末尾可以追加元素 nums[i] 仍然满足连续上升;nums[i]−nums[i−1]≠1 时,此时 cnt 重新置为 1,即在 nums[i−1] 末尾无法追加 nums[i];
2024-11-07 13:55:21
164
原创 C++长度为 K 的子数组的能量值 I
我们需要找到长度为 k 且满足连续上升的子数组中的最大元素,此时直接枚举数组中所有长度为 k 的子数组,并判断该数组是否满足连续且上升即可。子数组满足连续上升,此时子数组中相邻元素的差值一定为 1,即满足 nums[j]−nums[j−1]=1。如果子数组满足连续上升,此时最大值即为子数组中的最后一个元素,能量值即为子数组的最后一个元素;如果不满足,则此时能量值为 −1,按照上述描述依次枚举并返回能量值即可。
2024-11-06 20:05:29
141
原创 C++求出硬币游戏的赢家
因此,价值 75 的硬币可以被操作 x 次,价值为 10 的硬币可以被操作 ⌊ 4y ⌋ 次,其中 ⌊⋅⌋ 表示向下取整。最多可以进行的操作次数为二者的较小值:如果其为奇数,那么最后一次操作的(即获胜的玩家)是 Alice,否则是 Bob。价值总和为 115 的硬币只能由 115=75+10+10+10+10 组成,每一名玩家需要拿走 1 枚价值 75 的硬币以及 4 枚价值 10 的硬币。
2024-11-05 21:38:46
131
原创 Java平方数之和
在枚举 a 的同时,使用 sqrt 函数找出 b。注意:本题 c 的取值范围在 [0,2 31−1],因此在计算的过程中可能会发生 int 型溢出的情况,需要使用 long 型避免溢出。时间复杂度:O( c )。枚举 a 的时间复杂度为 O( c ),对于每个 a 的值,可在 O(1) 的时间内寻找 b。空间复杂度:O(1)。
2024-11-04 21:59:45
136
原创 C++大礼包
计算购买大礼包 cur_special 后新的购物清单 nxt_needs,并递归地计算满足购物清单 nxt_needs 所需花费的最低价格 nxt_price;计算满足当前购物清单 cur_needs 所需花费的最低价格 cur_price=special_price+nxt_price;如果 cur_price<min_price,则将 min_price 更新为 cur_price。返回计算满足购物清单 cur_needs 所需花费的最低价格 min_price。
2024-11-03 14:12:43
262
原创 使两个整数相等的位更改次数
从低位到高位枚举 n 和 k 的二进制位,分别记为 b n和bk:如果 bn=0 且 bk=1,那么说明无法将 n 改成 k,返回 −1。如果bn=1 且 bk=0,那么需要将对应的 bn改成 0,并且将更改次数计入总更改次数。最后返回总更改次数。
2024-11-02 19:07:46
115
原创 C++超级饮料的最大强化能量
也是如此,状态转移公式:a=max(a+ea[i],b) b=max(b+eb[i],a)。然后换道的结果,这两种结果的最大值。的结果,或者上次选择。
2024-11-01 20:58:44
133
原创 交换后字典序最小的字符串
思路:题目要求最多交换一次相邻字符,并且满足交换的两个字符所表示的数字奇偶性相同,使得最终得到的字符串字典序最小。若两个字符串长度相同,则拥有首个不同字符中较小那个的字符串字典序更小,因此我们在枚举相邻两个字符交换时需要尽早的交换,并且交换之前后面的字符要小于前面的字符。
2024-10-31 21:56:54
141
原创 C++交换后字典序最小的字符串
若两个字符串长度相同,则拥有首个不同字符中较小那个的字符串字典序更小,因此我们在枚举相邻两个字符交换时需要尽早的交换,并且交换之前后面的字符要小于前面的字符。思路:题目要求我们最多交换一次相邻字符,并且满足交换的两个字符所表示的数字奇偶性相同,使得最终得到的字符串字典序最小。
2024-10-30 19:38:29
158
原创 C++生成不含相邻零的二进制字符串
当 n 分别为 1,2,3,4,5 时,结果的长度分别为 2,3,5,8,13,可以猜测数组的长度呈现斐波那契数列的规律。假设 n−2 时,结果中,末尾为 ‘0’ 的字符串有 a 个,末尾为 ‘1’ 的字符串有 b 个;n−1 时,结果中,末尾为 ‘0’ 的字符串有 c 个,末尾为 ‘1’ 的字符串有 d 个。那么 n 时,结果中就会有 c+2×d 个字符串,而 d=a+b,因此结果中会有 a+b+c+d 个字符串,正好是 n−2 时结果中字符串个数与 n−1 时结果中字符串个数之和。递归的起点为空数组。
2024-10-29 21:21:30
192
原创 C++冗余连接
否则,令 parent[v]=u,然后在并查集中分别找到 u 和 v 的祖先(即各自的连通分支中的根节点),如果祖先相同,说明这条边导致环路出现,将当前的边 [u,v] 记为导致环路出现的边,如果祖先不同,则在并查集中将 u 和 v 进行合并。如果有导致冲突的边,记这条边为 [u,v],则有两条边指向 v,另一条边为 [parent[v],v],需要通过判断是否有导致环路的边决定哪条边是附加的边。如果没有导致环路的边,则附加的边是后被访问到的指向 v 的边,因此附加的边是 [u,v]。
2024-10-28 18:07:38
360
原创 C++学习解并查集
这道题中的图在树的基础上多了一条附加的边,因此边的数量也是 n。如果两个顶点属于相同的连通分量,则说明在遍历到当前的边之前,这两个顶点之间已经连通,因此当前的边导致环出现,为附加的边,将当前的边作为答案返回。如果两个顶点属于不同的连通分量,则说明在遍历到当前的边之前,这两个顶点之间不连通,因此当前的边不会导致环出现,合并这两个顶点的连通分量。遍历每一条边,判断这条边连接的两个顶点是否属于相同的连通分量。树是一个连通且无环的无向图,在树中多了一条附加的边之后就会出现环,因此附加的边即为导致环出现的边。
2024-10-27 20:09:50
234
原创 C++执行操作可获得的最大总奖励 II
要根据以上推断,一次操作前后的 dp 数组(分别记为 f 1 和 f 0)之前的递推关系为:f 0 [k]=f 1[k−x] ∣ f 0[k],k∈[x,2x−1]可以用位运算表示为 f 0=(mask x (f 1 )≪x) ∣ f 0 ,其中 mask x (f 1 ) 函数表示取 f1的低 x 位。假设上一次操作选择的奖励值为 x 1 ,那么执行操作后的总奖励 x≥x 1 ,根据题意,后面任一操作选择的奖励值 x 2一定都大于 x,从而有 x 2 >x 1,因此执行的操作是按照奖励值单调递增的。
2024-10-26 14:12:06
141
原创 C++执行操作可获得的最大总奖励
根据以上推断,首先将 rewardValues 从小到大进行排序,使用 dp[k] 表示总奖励 k 是否可获得,初始时 dp[0]=1,表示不执行任何操作获得总奖励 0。然后我们对 rewardValues 进行遍历,令当前值为 x,那么对于 k∈[x,2x−1](将 k 倒序枚举),将 dp[k] 更新为 dp[k−x] ∣ dp[k](符号 ∣ 表示或操作),表示先前的操作可以获得总奖励 k−x,那么加上 x 后,就可以获取总奖励 k。最后返回 dp 中可以获得的最大总奖励。
2024-10-25 22:54:02
143
原创 学习编程算法双指针
由于比赛输了的玩家会排到队列末尾,因此如果前面一直没有人是赢家(连续赢下 k 次),那么 skills 值最高的那个玩家就是赢家。若能,则直接返回答案,否则继续遍历,直到末尾。需要注意的是,如果 i 不为 0,那么第 i 个玩家最少已经赢了一次(与 i 进行比赛的上一个玩家,输掉后排到末尾)。另外,玩家 i 后面那些输掉比赛的玩家一定不是赢家,因为要么玩家 i 是赢家,要么玩家 i 后面还有一个 skills 值更高的玩家,并且与玩家 i 相隔不超过 k(或者 k−1)。
2024-10-24 20:54:17
245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人