这道题如果普通手段,其实就是通过另外一个数组来实现,但是如果要原地完成就比较难想到了。其实可以通过三次翻转法,也就是先对整个数组翻转,然后翻转前 k 个,再翻转后 n-k 个,这样就能达到右移的效果。func rotate(nums []int, k int) { n := len(nums) for i, j := 0, n-1; i < j; i, j = i+1...
SnowKagura‘s blog
直面生活,热爱生活这题,要么先频次统计然后小顶堆,要么频次统计后分桶,同样频次的数字放一个桶,小顶堆的时间复杂度会高一点,所以不如分桶,空间换时间。func topKFre...
这道题要分割出两个数组,平均值需要相等,那其实就相当于分出一个有k个元素的数组的平均值和整体数组的平均值相等就可以满足了,也就是 $target / k = sum / n$。那么 $target = sum * k / n$所以我们需要求的其实就是不同的 k 对应的和(target)是否等于 sum * k / n所以定义可达性 DP 数组如下:dpk 代表刚好 k 个数能组成的和有哪些,...
这道题跟 构建回文串检测 的思路很像,因为都是统计字符个数,然后看构造回文串的条件。因为是构造最长的回文串,所以思路略微有点不同,碰到字符频次为奇数的需要...
这道题有一个关键条件就是 l..r 之间的字符可以重排,那么我们只需要关注字符频次满足回文串要求即可。长度为偶数的情况下,需要满足所有的字符频次为偶数。长度为奇数的情况下,有一个字符是奇数频次。而字符频次可以巧妙的转换成用异或进行统计,因为只有奇数频次才会是1。然后因为我们是需要多次查询,所以可以提前进行预处理,像这种涉及区间查询的问题,常用的手段就是前缀和,这道题也不例外。构造一个 pre...