Hard
Minimum Falling Path Sum II — C++
Full explanation · Time O(m * n) · Space O(1)
// Time: O(m * n)
// Space: O(1)
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& arr) {
for (int i = 1; i < arr.size(); ++i) {
const auto& smallest_two = nsmallest(2, arr[i - 1]);
for (int j = 0; j < arr[0].size(); ++j) {
arr[i][j] += (arr[i - 1][j] == smallest_two[0]) ? smallest_two[1] : smallest_two[0];
}
}
return *min_element(arr.back().cbegin(), arr.back().cend());
}
private:
vector<int> nsmallest(int k, const vector<int>& arr) {
priority_queue<int> max_heap;
for (const auto& x : arr) {
max_heap.emplace(x);
if (max_heap.size() > k) {
max_heap.pop();
}
}
vector<int> result;
while (!max_heap.empty()) {
result.emplace_back(max_heap.top()); max_heap.pop();
}
return {result.crbegin(), result.crend()};
}
};