这个题目总共能买卖两次,且必须要先卖掉第一次才能买第二次的,所以可以从左往右扫描获得 [0, i] 的最大盈利,从右往左扫描 [i, n-1] 的最大盈利,然后 left[i] + right[i] 的最大值就是两次购买的最大盈利了。func maxProfit(prices []int) int { n := len(prices) minLeft := prices[0]...
Articles in the category of Leetcode
- Home
- Leetcode
这道题,我们需要先通过把单词录入哈希表。然后构造一个可达性DP,dp[i] 代表了 s[0..i] 是否能拆分成 wordsDict 中的单词,再通过可达...
这道题如果普通手段,其实就是通过另外一个数组来实现,但是如果要原地完成就比较难想到了。其实可以通过三次翻转法,也就是先对整个数组翻转,然后翻转前 k 个,再翻转后 n-k 个,这样就能达到右移的效果。func rotate(nums []int, k int) { n := len(nums) for i, j := 0, n-1; i < j; i, j = i+1...
这题,要么先频次统计然后小顶堆,要么频次统计后分桶,同样频次的数字放一个桶,小顶堆的时间复杂度会高一点,所以不如分桶,空间换时间。func topKFre...
这道题要分割出两个数组,平均值需要相等,那其实就相当于分出一个有k个元素的数组的平均值和整体数组的平均值相等就可以满足了,也就是 $target / k = sum / n$。那么 $target = sum * k / n$所以我们需要求的其实就是不同的 k 对应的和(target)是否等于 sum * k / n所以定义可达性 DP 数组如下:dpk 代表刚好 k 个数能组成的和有哪些,...