Press "Enter" to skip to content

Posts published in “Algorithms”

花花酱 LeetCode 2161. Partition Array According to Given Pivot

最直接的方法就是扫描三遍,<, = , > pivot。

时间复杂度:O(n)
空间复杂度:O(1) // no extra space used except for output

花花酱 LeetCode 2016. Maximum Difference Between Increasing Elements

数据规模 n <= 1000。O(n2) 的算法也是能过的。

方法1: Brute Force

双重循环枚举所有的(nums[i], nums[j])的组合。

时间复杂度:O(n2)
空间复杂度:O(1)

方法2: 空间换时间

使用prefix sum算法,预先计算num[i] ~ nums[n-1]的最大值,存储在right[i]中。

时间复杂度:O(n)
空间复杂度:O(n)

方法3: Running Min

从左到右遍历,记录当前为止出现过最小的值。比较 nums[i] – 最小值 和 最优解。

时间复杂度:O(n)
空间复杂度:O(1)

花花酱 LeetCode 2012. Sum of Beauty in the Array

数据规模比较大,算法必须是O(n)的。

可以预先使用O(n)时间计算nums[0] .. nums[i]的最大值,存在left[i]中,以及nums[i] .. nums[n-1]的最小值存在right[i]中。然后再按题目的定义计算即可。

时间复杂度:O(n)
空间复杂度:O(n)

花花酱 LeetCode 462. Minimum Moves to Equal Array Elements II

不太喜欢这样的题目,你需要证明/猜测最优解是将所有数字转换成median/中位数。

使用nth_element找中位数,然后再循环一遍求合即可。

时间复杂度:O(n)
空间复杂度:O(1)

花花酱 LeetCode 3462. Maximum Sum With at Most K Elements

本题使用了两次 partial sorting / std::nth_element 来进行部分排序,可以作为经典教程了。

速度比全排序或者heap/pq快到不知道哪里去了~

Time complexity: O(m*n)
Space complexity: O(m*n)

不用黑科技就达到99.77%