2024-04-26 Daily Challenge

Today I have done leetcode's April LeetCoding Challenge with cpp.

April LeetCoding Challenge 26

Description

Minimum Falling Path Sum II

Given an n x n integer matrix grid, return the minimum sum of a falling path with non-zero shifts.

A falling path with non-zero shifts is a choice of exactly one element from each row of grid such that no two elements chosen in adjacent rows are in the same column.

 

Example 1:

Input: grid = [[1,2,3],[4,5,6],[7,8,9]]
Output: 13
Explanation: 
The possible falling paths are:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
The falling path with the smallest sum is [1,5,7], so the answer is 13.

Example 2:

Input: grid = [[7]]
Output: 7

 

Constraints:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99

Solution

class Solution {
public:
  int minFallingPathSum(vector<vector<int>>& grid) {
    vector<int> minimum = {0, 0};
    int minIndex = -1;
    int cols = grid.front().size();
    for(const auto &row : grid) {
      // cout << minimum[0] << ' ' << minimum[1] << ' ' << minIndex << endl;
      int newIndex = -1;
      vector<int> newMinimum = {INT_MAX, INT_MAX};
      for(int j = 0; j < cols; ++j) {
        int mmin = row[j] + minimum[j == minIndex];
        if(mmin < newMinimum[0]) {
          newMinimum[1] = newMinimum[0];
          newMinimum[0] = mmin;
          newIndex = j;
        } else if(mmin < newMinimum[1]) {
          newMinimum[1] = mmin;
        }
      }
      swap(minimum, newMinimum);
      minIndex = newIndex;
    }
    return minimum[0];
  }
};