复盘|第286场周赛
找出两数组的不同
【哈希】存两个哈希集合,遍历st1判断是否位于st2,遍历st2判断是否位于st1.
美化数组的最少删除数
【栈模拟】从前往后遍历 + 需要考虑相邻元素 + 有消除操作 = 栈。栈模拟,栈大小为偶数,遍历整个数组,则可以随意加入栈,栈大小为奇数,则加入的元素不能和栈顶相同。遍历结束后,若栈大小为奇数则移除栈顶。代码中可以不需要实际用栈,采用栈的思想,用一个变量表示栈的奇偶性。
【一次遍历】保证i每次落到删除之后的偶数位置。(else i++和for循环的i++刚好跳两格)
找到指定长度的回文数
【数学】回文数的左半部分是从100开始增加的,找规律可发现第q个回文数的左半部分为10^⌊(intLength - 1) / 2⌋ + q - 1。反转这个数,拼到左半部分之后即为第q个长为intLength的回文数,如果intLength为奇数则先去掉最低位再反转。
从栈中取出 K 个硬币的最大面值和
【DP】题意是对每个站.转化为分组背包模型,从n个物品组里取物品体积和为k的物品,且每组至多取一个物品时的物品价值最大和。定义dp[i] [j]为从前i个组取体积之和为j的物品时,物品价值之和的最大值。枚举第i个组所有物品,设当前物品体积为v,价值为w,则有dp[i] [j] = max(dp[i] [j], dp[i - 1] [j - w] + v),ans = dp[n] [k]。也可以仿造01背包将第一维压缩掉.