Find the row with maximum number of 1s
Last Updated :
04 Sep, 2023
Given a boolean 2D array, where each row is sorted. Find the row with the maximum number of 1s.
Example:
Input matrix : 0 1 1 1
0 0 1 1
1 1 1 1 // this row has maximum 1s
0 0 0 0
Output: 2
A simple method is to do a row-wise traversal of the matrix, count the number of 1s in each row, and compare the count with the max. Finally, return the index of the row with a maximum of 1s. The time complexity of this method is O(m*n) where m is the number of rows and n is the number of columns in the matrix.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
int rowWithMax1s( bool mat[R][C]) {
int rowIndex = -1 ;
int maxCount = 0 ;
for ( int i = 0 ; i < R ; i++){
int count = 0 ;
for ( int j = 0 ; j < C ; j++ ){
if (mat[i][j] == 1){
count++ ;
}
}
if (count > maxCount){
maxCount = count ;
rowIndex = i ;
}
}
return rowIndex ;
}
int main()
{
bool mat[R][C] = { {0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 1},
{0, 0, 0, 0}};
cout << "Index of row with maximum 1s is " << rowWithMax1s(mat);
return 0;
}
|
C
#include<stdio.h>
#include<stdbool.h>
#define R 4
#define C 4
int rowWithMax1s( bool mat[R][C]) {
int indexOfRowWithMax1s = -1 ;
int maxCount = 0 ;
for ( int i = 0 ; i < R ; i++){
int count = 0 ;
for ( int j = 0 ; j < C ; j++ ){
if (mat[i][j] == 1){
count++ ;
}
}
if (count > maxCount){
maxCount = count ;
indexOfRowWithMax1s = i ;
}
}
return indexOfRowWithMax1s ;
}
int main()
{
bool mat[R][C] = { {0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 1},
{0, 0, 0, 0}};
int indexOfRowWithMax1s = rowWithMax1s(mat);
printf ( "Index of row with maximum 1s is %d" ,indexOfRowWithMax1s);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int R = 4 ;
static int C = 4 ;
static int rowWithMax1s( int mat[][], int R, int C)
{
boolean flag = true ;
int max_row_index = 0 , max_ones = 0 ;;
for ( int i = 0 ; i < R ; i++){
int count1 = 0 ;
for ( int j = 0 ; j < C ; j++){
if (mat[i][j] == 1 ){
count1++;
flag = false ;
}
}
if (count1>max_ones){
max_ones = count1;
max_row_index = i;
}
}
if (flag){
return - 1 ;
}
return max_row_index;
}
public static void main(String[] args) {
int mat[][] = { { 0 , 0 , 0 , 1 },
{ 0 , 1 , 1 , 1 },
{ 1 , 1 , 1 , 1 },
{ 0 , 0 , 0 , 0 }};
System.out.print( "Index of row with maximum 1s is " + rowWithMax1s(mat,R,C));
}
}
|
Python3
R,C = 4 , 4
def first(arr , low , high):
if (high > = low):
mid = low + (high - low) / / 2
if ( ( mid = = 0 or arr[mid - 1 ] = = 0 ) and arr[mid] = = 1 ):
return mid
elif (arr[mid] = = 0 ):
return first(arr, (mid + 1 ), high);
else :
return first(arr, low, (mid - 1 ));
return - 1
def rowWithMax1s(mat):
max_row_index, Max = 0 , - 1
for i in range (R):
index = first (mat[i], 0 , C - 1 )
if (index ! = - 1 and C - index > Max ):
Max = C - index;
max_row_index = i
return max_row_index
mat = [[ 0 , 0 , 0 , 1 ],
[ 0 , 1 , 1 , 1 ],
[ 1 , 1 , 1 , 1 ],
[ 0 , 0 , 0 , 0 ]]
print ( "Index of row with maximum 1s is " + str (rowWithMax1s(mat)))
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static int R = 4;
static int C = 4;
static int first( int []arr, int low, int high) {
if (high >= low)
{
int mid = low + (high - low) / 2;
if ((mid == 0 || arr[mid - 1] == 0) && arr[mid] == 1)
return mid;
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
else
return first(arr, low, (mid - 1));
}
return -1;
}
public static int [] GetRow( int [,] matrix, int row)
{
var rowLength = matrix.GetLength(1);
var rowVector = new int [rowLength];
for ( var i = 0; i < rowLength; i++)
rowVector[i] = matrix[row, i];
return rowVector;
}
static int rowWithMax1s( int [,]mat)
{
int max_row_index = 0, max = -1;
int i, index;
for (i = 0; i < R; i++) {
int []row = GetRow(mat,i);
index = first(row, 0, C - 1);
if (index != -1 && C - index > max) {
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
public static void Main(String[] args) {
int [,]mat = { { 0, 0, 0, 1 },
{ 0, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 0, 0, 0, 0 } };
Console.Write( "Index of row with maximum 1s is " + rowWithMax1s(mat));
}
}
|
Javascript
<script>
var R = 4 ;
var C = 4 ;
function first(arr , low , high)
{
if (high >= low)
{
var mid = low + parseInt((high - low)/2);
if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
return mid;
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
else
return first(arr, low, (mid -1));
}
return -1;
}
function rowWithMax1s(mat)
{
var max_row_index = 0, max = -1;
var i, index;
for (i = 0; i < R; i++)
{
index = first (mat[i], 0, C-1);
if (index != -1 && C-index > max)
{
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
var mat = [[0, 0, 0, 1],
[0, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]];
document.write( "Index of row with maximum 1s is " + rowWithMax1s(mat));
</script>
|
Output
Index of row with maximum 1s is 2
Time Complexity: O(m*n)
Auxiliary Space: O(1)
We can do better. Since each row is sorted, we can use Binary Search to count 1s in each row. We find the index of the first instance of 1 in each row. The count of 1s will be equal to the total number of columns minus the index of the first 1.
Implementation: See the following code for the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
int first( bool arr[], int low, int high)
{
if (high >= low)
{
int mid = low + (high - low)/2;
if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
return mid;
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
else
return first(arr, low, (mid -1));
}
return -1;
}
int rowWithMax1s( bool mat[R][C])
{
int max_row_index = 0, max = -1;
int i, index;
for (i = 0; i < R; i++)
{
index = first (mat[i], 0, C-1);
if (index != -1 && C-index > max)
{
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
int main()
{
bool mat[R][C] = { {0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 1},
{0, 0, 0, 0}};
cout << "Index of row with maximum 1s is " << rowWithMax1s(mat);
return 0;
}
|
C
#include <stdio.h>
#define R 4
#define C 4
int first( bool arr[], int low, int high)
{
if (high >= low)
{
int mid = low + (high - low)/2;
if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
return mid;
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
else
return first(arr, low, (mid -1));
}
return -1;
}
int rowWithMax1s( bool mat[R][C])
{
int max_row_index = 0, max = -1;
int i, index;
for (i = 0; i < R; i++)
{
index = first (mat[i], 0, C-1);
if (index != -1 && C-index > max)
{
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
int main()
{
bool mat[R][C] = { {0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 1},
{0, 0, 0, 0}};
printf ( "Index of row with maximum 1s is %d "
, rowWithMax1s(mat));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int R = 4 , C = 4 ;
static int first( int arr[], int low, int high)
{
if (high >= low) {
int mid = low + (high - low) / 2 ;
if ((mid == 0 || (arr[mid - 1 ] == 0 )) && arr[mid] == 1 )
return mid;
else if (arr[mid] == 0 )
return first(arr, (mid + 1 ), high);
else
return first(arr, low, (mid - 1 ));
}
return - 1 ;
}
static int rowWithMax1s( int mat[][])
{
int max_row_index = 0 , max = - 1 ;
int i, index;
for (i = 0 ; i < R; i++) {
index = first(mat[i], 0 , C - 1 );
if (index != - 1 && C - index > max) {
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
public static void main(String[] args)
{
int mat[][] = { { 0 , 0 , 0 , 1 },
{ 0 , 1 , 1 , 1 },
{ 1 , 1 , 1 , 1 },
{ 0 , 0 , 0 , 0 } };
System.out.println( "Index of row with maximum 1s is "
+ rowWithMax1s(mat));
}
}
|
Python3
def first(arr, low, high):
if high > = low:
mid = low + (high - low) / / 2
if (mid = = 0 or arr[mid - 1 ] = = 0 ) and arr[mid] = = 1 :
return mid
elif arr[mid] = = 0 :
return first(arr, (mid + 1 ), high)
else :
return first(arr, low, (mid - 1 ))
return - 1
def rowWithMax1s(mat):
R = len (mat)
C = len (mat[ 0 ])
max_row_index = 0
max = - 1
for i in range ( 0 , R):
index = first(mat[i], 0 , C - 1 )
if index ! = - 1 and C - index > max :
max = C - index
max_row_index = i
return max_row_index
mat = [[ 0 , 0 , 0 , 1 ],
[ 0 , 1 , 1 , 1 ],
[ 1 , 1 , 1 , 1 ],
[ 0 , 0 , 0 , 0 ]]
print ( "Index of row with maximum 1s is" ,
rowWithMax1s(mat))
|
C#
using System;
class GFG
{
public static int R = 4, C = 4;
public static int first( int [] arr,
int low, int high)
{
if (high >= low)
{
int mid = low + (high - low) / 2;
if ((mid == 0 || (arr[mid - 1] == 0)) &&
arr[mid] == 1)
{
return mid;
}
else if (arr[mid] == 0)
{
return first(arr, (mid + 1), high);
}
else
{
return first(arr, low, (mid - 1));
}
}
return -1;
}
public static int rowWithMax1s( int [][] mat)
{
int max_row_index = 0, max = -1;
int i, index;
for (i = 0; i < R; i++)
{
index = first(mat[i], 0, C - 1);
if (index != -1 && C - index > max)
{
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
public static void Main( string [] args)
{
int [][] mat = new int [][]
{
new int [] {0, 0, 0, 1},
new int [] {0, 1, 1, 1},
new int [] {1, 1, 1, 1},
new int [] {0, 0, 0, 0}
};
Console.WriteLine( "Index of row with maximum 1s is " +
rowWithMax1s(mat));
}
}
|
Javascript
<script>
R = 4
C = 4
const first = (arr, low, high) => {
if (high >= low) {
let mid = low + parseInt((high - low) / 2);
if ((mid == 0 || arr[mid - 1] == 0) && arr[mid] == 1)
return mid;
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
else
return first(arr, low, (mid - 1));
}
return -1;
}
const rowWithMax1s = (mat) => {
let max_row_index = 0, max = -1;
let i, index;
for (i = 0; i < R; i++) {
index = first(mat[i], 0, C - 1);
if (index != -1 && C - index > max) {
max = C - index;
max_row_index = i;
}
}
return max_row_index;
}
let mat = [
[0, 0, 0, 1],
[0, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]
];
document.write(`Index of row with maximum 1s is ${rowWithMax1s(mat)}`);
</script>
|
PHP
<?php
define( "R" , 4);
define( "C" , 4);
function first( $arr , $low , $high )
{
if ( $high >= $low )
{
$mid = $low + intval (( $high - $low ) / 2);
if (( $mid == 0 || $arr [ $mid - 1] == 0) &&
$arr [ $mid ] == 1)
return $mid ;
else if ( $arr [ $mid ] == 0)
return first( $arr , ( $mid + 1), $high );
else
return first( $arr , $low , ( $mid - 1));
}
return -1;
}
function rowWithMax1s( $mat )
{
$max_row_index = 0;
$max = -1;
for ( $i = 0; $i < R; $i ++)
{
$index = first ( $mat [ $i ], 0, (C - 1));
if ( $index != -1 && (C - $index ) > $max )
{
$max = C - $index ;
$max_row_index = $i ;
}
}
return $max_row_index ;
}
$mat = array ( array (0, 0, 0, 1),
array (0, 1, 1, 1),
array (1, 1, 1, 1),
array (0, 0, 0, 0));
echo "Index of row with maximum 1s is " .
rowWithMax1s( $mat );
?>
|
Output
Index of row with maximum 1s is 2
Time Complexity: O(m log n) where m is the number of rows and n is the number of columns in the matrix.
Auxiliary Space: O(log n), as implicit stack is created due to recursion.
The above solution can be optimized further. Instead of doing a binary search in every row, we first check whether the row has more 1s than max so far. If the row has more 1s, then only count 1s in the row. Also, to count 1s in a row, we don’t do a binary search in a complete row, we do a search before the index of the last max.
Implementation: Following is an optimized version of the above solution.
C++
#include <bits/stdc++.h>
using namespace std;
int rowWithMax1s( bool mat[R][C])
{
int i, index;
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
for (i = 1; i < R; i++)
{
if (max != -1 && mat[i][C - max - 1] == 1)
{
index = first (mat[i], 0, C - max);
if (index != -1 && C - index > max)
{
max = C - index;
max_row_index = i;
}
}
else
{
max = first(mat[i], 0, C - 1);
}
}
return max_row_index;
}
|
C
int rowWithMax1s( bool mat[R][C])
{
int i, index;
int max_row_index = 0;
int max = first(mat[0], 0, C-1);
for (i = 1; i < R; i++)
{
if (max != -1 && mat[i][C-max-1] == 1)
{
index = first (mat[i], 0, C-max);
if (index != -1 && C-index > max)
{
max = C - index;
max_row_index = i;
}
}
else {
max = first(mat[i], 0, C - 1);
}
}
return max_row_index;
}
|
Java
public class gfg
{
static int rowWithMax1s( boolean mat[][])
{
int i, index;
int max_row_index = 0 ;
int max = first(mat[ 0 ], 0 , C - 1 );
for (i = 1 ; i < R; i++)
{
if (max != - 1 && mat[i][C - max - 1 ] == 1 )
{
index = first (mat[i], 0 , C - max);
if (index != - 1 && C - index > max)
{
max = C - index;
max_row_index = i;
}
}
else
{
max = first(mat[i], 0 , C - 1 );
}
}
return max_row_index;
}
}
|
Python3
def rowWithMax1s(mat):
max_row_index = 0
max = first(mat[ 0 ], 0 , C - 1 )
for i in range ( 1 , R):
if ( max ! = - 1 and mat[i][C - max - 1 ] = = 1 ):
index = first(mat[i], 0 , C - max )
if (index ! = - 1 and C - index > max ):
max = C - index
max_row_index = i
else :
max = first(mat[i], 0 , C - 1 )
return max_row_index
|
C#
using System;
class GFG
{
static int rowWithMax1s( bool [,] mat)
{
int i, index;
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
for (i = 1; i < R; i++)
{
if (max != -1 && mat[i,C - max - 1] == 1)
{
index = first (mat[i], 0, C - max);
if (index != -1 && C - index > max)
{
max = C - index;
max_row_index = i;
}
}
else
{
max = first(mat[i], 0, C - 1);
}
}
return max_row_index;
}
}
|
Javascript
<script>
function rowWithMax1s(mat)
{
let i, index;
let max_row_index = 0;
let max = first(mat[0], 0, C - 1);
for (i = 1; i < R; i++)
{
if (max != -1 && mat[i][C - max - 1] == 1)
{
index = first (mat[i], 0, C - max);
if (index != -1 && C - index > max)
{
max = C - index;
max_row_index = i;
}
}
else
{
max = first(mat[i], 0, C - 1);
}
}
return max_row_index;
}
</script>
|
Time complexity: O(m log n),
Auxiliary Space: O(log n)
Thanks to Naveen Kumar Singh for suggesting the above solution.
The worst case of the above solution occurs for a matrix like following.
0 0 0 … 0 1
0 0 0 ..0 1 1
0 … 0 1 1 1
….0 1 1 1 1
Following method works in O(m+n) time complexity in worst case.
- Step1: Get the index of first (or leftmost) 1 in the first row.
- Step2: Do following for every row after the first row
- …IF the element on left of previous leftmost 1 is 0, ignore this row.
- …ELSE Move left until a 0 is found. Update the leftmost index to this index and max_row_index to be the current row.
- The time complexity is O(m+n) because we can possibly go as far left as we came ahead in the first step.
Implementation: Following is the implementation of this method.
C++
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
int rowWithMax1s( bool mat[R][C])
{
int j,max_row_index = 0;
j = C - 1;
for ( int i = 0; i < R; i++) {
bool flag= false ;
while (j >= 0 && mat[i][j] == 1) {
j = j - 1;
flag= true ;
}
if (flag){
max_row_index = i;
}
}
if (max_row_index==0&&mat[0][C-1]==0)
return -1;
return max_row_index;
}
int main()
{
bool mat[R][C] = { {0, 0, 0, 1},
{0, 1, 1, 1},
{1, 1, 1, 1},
{0, 0, 0, 0}};
cout << "Index of row with maximum 1s is " << rowWithMax1s(mat);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int R = 4 , C = 4 ;
static int rowWithMax1s( int mat[][])
{
int j,max_row_index = 0 ;
j = C - 1 ;
for ( int i = 0 ; i < R; i++) {
while (j >= 0 && mat[i][j] == 1 ) {
j = j - 1 ;
max_row_index = i;
}
}
if (max_row_index== 0 &&mat[ 0 ][C- 1 ]== 0 )
return - 1 ;
return max_row_index;
}
public static void main(String[] args)
{
int mat[][] = { { 0 , 0 , 0 , 1 },
{ 0 , 1 , 1 , 1 },
{ 1 , 1 , 1 , 1 },
{ 0 , 0 , 0 , 0 } };
System.out.println( "Index of row with maximum 1s is " + rowWithMax1s(mat));
}
}
|
Python3
def rowWithMax1s(mat):
R = len (mat)
C = len (mat[ 0 ])
max_row_index = 0
index = C - 1
for i in range ( 0 , R):
flag = False
while (index > = 0 and mat[i][index] = = 1 ):
flag = True
index - = 1
if (flag):
max_row_index = i
if max_row_index = = 0 and mat[ 0 ][C - 1 ] = = 0 :
return 0
return max_row_index
mat = [[ 0 , 0 , 0 , 1 ],
[ 0 , 1 , 1 , 1 ],
[ 1 , 1 , 1 , 1 ],
[ 0 , 0 , 0 , 0 ]]
print ( "Index of row with maximum 1s is" ,
rowWithMax1s(mat))
|
C#
using System;
class GFG
{
public static int R = 4, C = 4;
public static int rowWithMax1s( int [][] mat)
{
int max_row_index = 0;
int i, index;
index=C-1;
for (i = 0; i < R; i++)
{
if (index >=0 && mat[i][index]==1)
{
index-=1;
max_row_index = i;
}
}
if (max_row_index==0&&mat[0][C-1]==0)
return 0;
return max_row_index;
}
public static void Main( string [] args)
{
int [][] mat = new int [][]
{
new int [] {0, 0, 0, 1},
new int [] {0, 1, 1, 1},
new int [] {1, 1, 1, 1},
new int [] {0, 0, 0, 0}
};
Console.WriteLine( "Index of row with maximum 1s is " +rowWithMax1s(mat));
}
}
|
Javascript
<script>
let R = 4
let C = 4
function rowWithMax1s(mat)
{
let j, max_row_index = 0;
j = C - 1;
for (let i = 0; i < R; i++)
{
let flag = false ;
while (j >= 0 && mat[i][j] == 1)
{
j = j - 1;
flag = true ;
}
if (flag)
{
max_row_index = i;
}
}
if (max_row_index == 0 && mat[0][C - 1] == 0)
return -1;
return max_row_index;
}
let mat = [[0, 0, 0, 1],
[0, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]];
document.write( "Index of row with maximum 1s is " + rowWithMax1s(mat));
</script>
|
Output
Index of row with maximum 1s is 2
Time Complexity: O(m+n) where m is the number of rows and n is the number of columns in the matrix.
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...