5404. 用栈操作构建数组
思路:
如果一个数在最后的数组里,只push;不在最后的数组里面,先push再pop
1 | class Solution: |
5405. 形成两个异或相等数组的三元组数目
思路:
类似前缀和的想法,将前n个数的异或和存储下来,例如$sum[i]= arr[0] \land arr[1] \land … \land arr[i]$,那么从i
到j
的异或和为 $sum[i-1] \land sum[j]$,另外0和任何数x异或和为x
1 | class Solution: |
5406. 收集树上所有苹果的最少时间
思路:
类似层次遍历,对于每一个需要遍历的节点,从下向根节点回溯;如果该节点没有走过,结果加2,将该节点的父节点加入待遍历的节点;如果之前走过则,则忽略。
对于样例1
初始时 需要遍历(2,4,5);依次遍历,每次路径长度结果+2,然后将对应的父节点(1,0)加入待遍历节点;此时结果为6;
现在需要遍历(1,0),对于0已经是根节点,可以跳过;对于1,结果+2,将对应的父节点(0)加入待遍历节点;此时结果为8;
最后只剩下(0),跳过。最终结果为8。
1 | class Solution: |
5407. 切披萨的方案数
思路:
比较容易想到的方法是直接搜索,递归实现深度优先搜索进行寻找。直接暴力搜索会超时,加入简单的剪枝操作和记忆化搜索可以过。之后想了会用动态规划应该是比较直观的方法,但是动态规划和记忆化的搜索本质上没有太大的区别,都是记录了中间过程的最优方案。
因为每次切完都是拿掉左边和上边的部分,剩余右下的部分,因此可以用剩余pizza的左上角的点的位置,来形象的表示切pizza的操作。
横向切pizza即改变左上角的横坐标,纵向切pizza即改变左上角的纵坐标。
搜索剪枝:对于剩余的pizza,如果横切和纵切所有的可能方案数比k-1
小,那么不可能将当前剩余的pizza切成k
份。
记忆化:对于同一个pizza,(i,j,k)
可以唯一标识 剩余的pizza需要被切成k
份的方案数量。
1 | class Solution: |