Search code examples
c++algorithmrecursionminfunction-definition

Smallest element in each row of matrix C++


This code can only return one smallest element in a matrix, but how if I want to return smallest element in each row? I need to use recursive function in C++. Thanks for your help

#include<iostream>
using namespace std;
int smallest(int** arr, int rows, int columns, int column_index = 0)
{
    if (rows <= 0 || column_index >= columns)
        return INT_MAX;


    if (rows == 1)
        return min(*(*arr + column_index),       
            smallest(arr, 1, columns - 1,
                column_index + 1)); 


    return min(smallest(arr, 1, columns), 
        smallest(arr + 1, rows - 1, columns));
}
int main()
{
    int row, col, index=0;
    cin >> row;
    cin >> col;
    int** arr;
    arr = new int* [row];
    for (int i = 0; i < row; i++) {
         arr[i] = new int[col];
         for (int j = 0; j < col; j++) {
             cin >> arr[i][j];
           }
        }
    cout<<smallest(arr, row, col, index);
    return 0;
}

Solution

  • I think this much code will be sufficient if you use standard algorithm - std::min_element:

    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    int main() {
        int r, c;
        std::cin >> r >> c;
        std::vector<std::vector<int>> mat(r, std::vector<int>(c));
        for (auto &&row : mat)
            for (auto &&ele : row)
                std::cin >> ele;
        for (auto &&row : mat)
            std::cout << *std::min_element(row.begin(), row.end()) << std::endl;
    }
    

    If you want to do it your way (old school style, using recursion) then do something like this. You just need to fix the index of row while calling smallest. Below is some self-explanatory code :

    #include <algorithm>
    #include <iostream>
    
    // here row_index represents the index of row and col represents the number of
    // elements in that row which are not yet traversed (counted from beginning)
    int smallest(int **arr, int row_index, int col) {
    
        // only first element is not traversed
        if (col == 1)
            return arr[row_index][0];
    
        // return minimum of last element and value returned by recursive call for
        // first col - 1 elements
        return std::min(arr[row_index][col - 1], smallest(arr, row_index, col - 1));
    }
    
    int main() {
        int row, col;
        std::cin >> row;
        std::cin >> col;
        int **arr = new int *[row];
        for (int i = 0; i < row; i++) {
            arr[i] = new int[col];
            for (int j = 0; j < col; j++)
                std::cin >> arr[i][j];
        }
    
        // call the function for each row
        for (int i = 0; i < row; i++)
            std::cout << "Smallest element in row " << i + 1 << " : "
                      << smallest(arr, i, col) << '\n';
    }