给定一个布尔2D数组,其中对每一行进行排序。查找最大为1s的行。
例子:
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
一种简单的方法是对矩阵进行逐行遍历,计算每行中1的数目,然后将计数与最大值进行比较。最后,返回最大为1s的行的索引。此方法的时间复杂度为O(m * n),其中m是矩阵中的行数,n是矩阵中的列数。
我们可以做得更好。由于每一行都是已排序的,因此我们可以使用二进制搜索来计算每一行中的1。我们在每一行中找到1的第一个实例的索引。 1的计数等于列总数减去前1的索引。
请参见以下代码,以实现上述方法。
C++
// CPP program to find the row
// with maximum number of 1s
#include
using namespace std;
#define R 4
#define C 4
// Function to find the index of first index
// of 1 in a boolean array arr[]
int first(bool arr[], int low, int high)
{
if(high >= low)
{
// Get the middle index
int mid = low + (high - low)/2;
// Check if the element at middle index is first 1
if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
return mid;
// If the element is 0, recur for right side
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
// If element is not first 1, recur for left side
else
return first(arr, low, (mid -1));
}
return -1;
}
// Function that returns index of row
// with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
// Initialize max values
int max_row_index = 0, max = -1;
// Traverse for each row and count number of 1s
// by finding the index of first 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;
}
// Driver Code
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;
}
// This is code is contributed by rathbhupendra
C
// C program to find the row
// with maximum number of 1s
#include
#define R 4
#define C 4
// Function to find the index of first index
// of 1 in a boolean array arr[]
int first(bool arr[], int low, int high)
{
if(high >= low)
{
// Get the middle index
int mid = low + (high - low)/2;
// Check if the element at middle index is first 1
if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
return mid;
// If the element is 0, recur for right side
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
// If element is not first 1, recur for left side
else
return first(arr, low, (mid -1));
}
return -1;
}
// Function that returns index of row
// with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
// Initialize max values
int max_row_index = 0, max = -1;
// Traverse for each row and count number of 1s
// by finding the index of first 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;
}
// Driver Code
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
// Java program to find the row
// with maximum number of 1s
import java.io.*;
class GFG {
static int R = 4, C = 4;
// Function to find the index of first index
// of 1 in a boolean array arr[]
static int first(int arr[], int low, int high)
{
if (high >= low) {
// Get the middle index
int mid = low + (high - low) / 2;
// Check if the element at middle index is first 1
if ((mid == 0 || (arr[mid - 1] == 0)) && arr[mid] == 1)
return mid;
// If the element is 0, recur for right side
else if (arr[mid] == 0)
return first(arr, (mid + 1), high);
// If element is not first 1, recur for left side
else
return first(arr, low, (mid - 1));
}
return -1;
}
// Function that returns index of row
// with maximum number of 1s.
static int rowWithMax1s(int mat[][])
{
// Initialize max values
int max_row_index = 0, max = -1;
// Traverse for each row and count number of
// 1s by finding the index of first 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;
}
// Driver Code
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));
}
}
// This code is contributed by 'Gitanjali'.
Python 3
# Python3 program to find the row
# with maximum number of 1s
# Function to find the index
# of first index of 1 in a
# boolean array arr[]
def first( arr, low, high):
if high >= low:
# Get the middle index
mid = low + (high - low)//2
# Check if the element at
# middle index is first 1
if (mid == 0 or arr[mid - 1] == 0) and arr[mid] == 1:
return mid
# If the element is 0,
# recur for right side
elif arr[mid] == 0:
return first(arr, (mid + 1), high)
# If element is not first 1,
# recur for left side
else:
return first(arr, low, (mid - 1))
return -1
# Function that returns
# index of row with maximum
# number of 1s.
def rowWithMax1s( mat):
# Initialize max values
R = len(mat)
C = len(mat[0])
max_row_index = 0
max = -1
# Traverse for each row and
# count number of 1s by finding
# the index of first 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
# Driver Code
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))
# This code is contributed
# by shreyanshi_arun
C#
// C# program to find the row with maximum
// number of 1s
using System;
class GFG
{
public static int R = 4, C = 4;
// Function to find the index of first index
// of 1 in a boolean array arr[]
public static int first(int[] arr,
int low, int high)
{
if (high >= low)
{
// Get the middle index
int mid = low + (high - low) / 2;
// Check if the element at middle
// index is first 1
if ((mid == 0 || (arr[mid - 1] == 0)) &&
arr[mid] == 1)
{
return mid;
}
// If the element is 0, recur
// for right side
else if (arr[mid] == 0)
{
return first(arr, (mid + 1), high);
}
// If element is not first 1, recur
// for left side
else
{
return first(arr, low, (mid - 1));
}
}
return -1;
}
// Function that returns index of row
// with maximum number of 1s.
public static int rowWithMax1s(int[][] mat)
{
// Initialize max values
int max_row_index = 0, max = -1;
// Traverse for each row and count number
// of 1s by finding the index of first 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;
}
// Driver Code
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));
}
}
// This code is contributed by Shrikant13
PHP
= $low)
{
// Get the middle index
$mid = $low + intval(($high - $low) / 2);
// Check if the element at middle
// index is first 1
if (($mid == 0 || $arr[$mid - 1] == 0) &&
$arr[$mid] == 1)
return $mid;
// If the element is 0, recur for
// right side
else if ($arr[$mid] == 0)
return first($arr, ($mid + 1), $high);
// If element is not first 1, recur
// for left side
else
return first($arr, $low, ($mid - 1));
}
return -1;
}
// Function that returns index of row
// with maximum number of 1s.
function rowWithMax1s($mat)
{
// Initialize max values
$max_row_index = 0;
$max = -1;
// Traverse for each row and count number
// of 1s by finding the index of first 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;
}
// Driver Code
$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);
// This code is contributed by rathbhupendra
?>
C++
#include
using namespace std;
// The main function that returns index
// of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i][C - max - 1] == 1)
{
// Note the optimization here also
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;
}
// This code is contributed by rathbhupendra
C
// The main function that returns index of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C-1);
// Traverse for each row and count number of 1s by finding the index
// of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row has more 1s than
// max so far
// Count 1s in this row only if this row has more 1s than
// max so far
if (max != -1 && mat[i][C-max-1] == 1)
{
// Note the optimization here also
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
{
// The main function that returns index
// of row with maximum number of 1s.
static int rowWithMax1s(boolean mat[][])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i][C - max - 1] == 1)
{
// Note the optimization here also
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;
}
}
// This code is contributed by divyesh072019.
Python3
# The main function that returns index
# of row with maximum number of 1s.
def rowWithMax1s(mat) :
# Initialize max using values from first row.
max_row_index = 0;
max = first(mat[0], 0, C - 1)
# Traverse for each row and count number of 1s
# by finding the index of first 1
for i in range(1, R):
# Count 1s in this row only if this row
# has more 1s than max so far
# Count 1s in this row only if this row
# has more 1s than max so far
if (max != -1 and mat[i][C - max - 1] == 1):
# Note the optimization here also
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;
# This code is contributed by Dharanendra L V
C#
using System;
class GFG
{
// The main function that returns index
// of row with maximum number of 1s.
static int rowWithMax1s(bool[,] mat)
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i,C - max - 1] == 1)
{
// Note the optimization here also
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;
}
}
// This code is contributed by divyeshrabadiya07.
Javascript
C++
// The main function that returns index of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C-1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i][j] == 1)
{
j = j-1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
Java
// The main function that returns index of row with maximum number of 1s.
static int rowWithMax1s(boolean mat[][])
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C - 1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i][j] == 1)
{
j = j - 1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
// This code is contributed by rutvik_56.
C#
// The main function that returns index of row with maximum number of 1s.
static int rowWithMax1s(bool[,] mat)
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C - 1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i, j] == 1)
{
j = j - 1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
// This code is contributed by Dharanendra L V.
输出:
Index of row with maximum 1s is 2
时间复杂度: O(mLogn),其中m是矩阵中的行数,n是矩阵中的列数。
上述解决方案可以进一步优化。我们首先检查该行是否比最大行数多1,而不是对每一行进行二进制搜索。如果该行具有更多的1,则仅在该行中计数1。另外,要连续计算1秒,我们不会在整行中进行二进制搜索,而是在last max的索引之前进行搜索。
以下是上述解决方案的优化版本。
C++
#include
using namespace std;
// The main function that returns index
// of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i][C - max - 1] == 1)
{
// Note the optimization here also
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;
}
// This code is contributed by rathbhupendra
C
// The main function that returns index of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C-1);
// Traverse for each row and count number of 1s by finding the index
// of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row has more 1s than
// max so far
// Count 1s in this row only if this row has more 1s than
// max so far
if (max != -1 && mat[i][C-max-1] == 1)
{
// Note the optimization here also
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
{
// The main function that returns index
// of row with maximum number of 1s.
static int rowWithMax1s(boolean mat[][])
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i][C - max - 1] == 1)
{
// Note the optimization here also
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;
}
}
// This code is contributed by divyesh072019.
Python3
# The main function that returns index
# of row with maximum number of 1s.
def rowWithMax1s(mat) :
# Initialize max using values from first row.
max_row_index = 0;
max = first(mat[0], 0, C - 1)
# Traverse for each row and count number of 1s
# by finding the index of first 1
for i in range(1, R):
# Count 1s in this row only if this row
# has more 1s than max so far
# Count 1s in this row only if this row
# has more 1s than max so far
if (max != -1 and mat[i][C - max - 1] == 1):
# Note the optimization here also
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;
# This code is contributed by Dharanendra L V
C#
using System;
class GFG
{
// The main function that returns index
// of row with maximum number of 1s.
static int rowWithMax1s(bool[,] mat)
{
int i, index;
// Initialize max using values from first row.
int max_row_index = 0;
int max = first(mat[0], 0, C - 1);
// Traverse for each row and count number of 1s
// by finding the index of first 1
for (i = 1; i < R; i++)
{
// Count 1s in this row only if this row
// has more 1s than max so far
// Count 1s in this row only if this row
// has more 1s than max so far
if (max != -1 && mat[i,C - max - 1] == 1)
{
// Note the optimization here also
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;
}
}
// This code is contributed by divyeshrabadiya07.
Java脚本
上述优化版本的最坏情况下的时间复杂度也是O(mLogn),该遗嘱解决方案平均可以更好地工作。感谢Naveen Kumar Singh建议上述解决方案。
对于下面的矩阵,上述解决方案的最坏情况发生了。
0 0 0…0 1
0 0 0 ..0 1 1
0…0 1 1 1
….0 1 1 1 1
在最坏的情况下,以下方法适用于O(m + n)时间复杂度。
步骤1:获取第一行中第一个(或最左边的)1的索引。
步骤2:对第一行之后的每一行进行跟踪
…如果前最左1的左侧的元素为0,则忽略此行。
…ELSE向左移动,直到找到0。将最左边的索引更新为此索引,并将max_row_index更新为当前行。
时间复杂度为O(m + n),因为我们可以尽可能快地走出第一步。
以下是此方法的实现。
C++
// The main function that returns index of row with maximum number of 1s.
int rowWithMax1s(bool mat[R][C])
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C-1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i][j] == 1)
{
j = j-1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
Java
// The main function that returns index of row with maximum number of 1s.
static int rowWithMax1s(boolean mat[][])
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C - 1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i][j] == 1)
{
j = j - 1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
// This code is contributed by rutvik_56.
C#
// The main function that returns index of row with maximum number of 1s.
static int rowWithMax1s(bool[,] mat)
{
// Initialize first row as row with max 1s
int max_row_index = 0;
// The function first() returns index of first 1 in row 0.
// Use this index to initialize the index of leftmost 1 seen so far
int j = first(mat[0], 0, C - 1);
if (j == -1) // if 1 is not present in first row
j = C - 1;
for (int i = 1; i < R; i++)
{
// Move left until a 0 is found
while (j >= 0 && mat[i, j] == 1)
{
j = j - 1; // Update the index of leftmost 1 seen so far
max_row_index = i; // Update max_row_index
}
}
return max_row_index;
}
// This code is contributed by Dharanendra L V.