Go语言程序:查找排序矩阵行中 1 的最大数量


在编程语言中,我们可以创建二维矩阵并在其中存储元素。二维矩阵是一种具有行和列的数据结构。在本文中,我们将介绍两种不同的逻辑来查找矩阵中排序行中 1 的最大数量。

例如,我们有以下矩阵

{0, 1, 1, 1},1 的数量 = 3

{0, 0, 1, 1},1 的数量 = 2

{1, 1, 1, 1},1 的数量 = 4

{0, 0, 0, 0},1 的数量 = 0

在第三行,我们有 4 个 1,比其他行都多。

方法 1

在这种方法中,我们将使用嵌套 for 循环,在循环中迭代数组并计算 1 的数量,最后返回最大计数。此方法的时间复杂度为 O(N*M),其中 N 是行的大小,M 是矩阵列的大小。

算法

步骤 1:导入所需的包。

步骤 2:程序首先从主函数开始。

  • 在主函数内部,我们首先声明一个大小为 4X4 的二维矩阵。

  • 稍后,我们将调用 max1in2DMatrix() 函数,该函数返回一行中 1 的最大数量。

  • 最后,我们打印上一步返回的值。

步骤 3:在 max1in2DMatrix() 函数中

  • 我们声明一个 maxCount 变量,其中我们存储 0 作为值。

  • 然后我们运行嵌套 for 循环。

  • 外部循环用于迭代所有行。

  • 在内部循环中,我们计算该行中 1 的数量。

  • 最后,我们返回该数字。

示例

这是查找二维矩阵中最大 1 的代码,通过在矩阵上运行嵌套循环,并在每次迭代中查找每行中 1 的数量,并更新保存最大 1 计数的变量。

package main

import "fmt"

// function to find the maximum number of 1 in a row
// having 2D array and int variables as arguments and
// int return type
func max1in2DMatrix(matrix [4][4]int, n int, m int) int {
    // declaring and initializing a variable to store the max count
    var maxCount int
    maxCount = 0

    // running nested for loop to iterate over the matrix and
    // count no. of ones in each row
    for i := 0; i < n; i++ {
        count := 0
        for j := 0; j < m; j++ {
            if matrix[i][j] == 1 {
                count++
            }
        }
        if maxCount < count {
            maxCount = count
        }
    }
    // returning the max count
    return maxCount
}

func main() {
    // creating a 2-dimensional array with 0 and 1 as value
    matrix := [4][4]int{
        {0, 1, 1, 1},
        {0, 0, 1, 1},
        {1, 1, 1, 1},
        {0, 0, 0, 0},
    }

    fmt.Println("Golang program to find the maximum number of 1 in a row using a for loop.")

    // calling a function with matrix name and size as parameters
    maxCount := max1in2DMatrix(matrix, 4, 4)

    fmt.Println("The maximum number of 1 in the array is", maxCount)
}

输出

Golang program to find the maximum number of 1 in a row using a for loop.
The maximum number of 1 in the array is 4

方法 2

在这种方法中,我们将使用二分查找算法查找一行中 1 的最大数量。二分查找算法是一种搜索算法,用于在排序数组中查找元素,时间复杂度为 O(logN)。使用二分查找算法,此方法的时间复杂度将为 O(NlogM),其中 N 是行的大小,M 是列的大小。

算法

步骤 1:导入所需的包

步骤 2:程序首先从主函数开始。

  • 在主函数内部,我们首先声明一个大小为 4X4 的二维矩阵。

  • 稍后,我们将调用 max1in2DMatrix() 函数,该函数返回一行中 1 的最大数量。

  • 最后,我们打印上一步返回的值。

步骤 3:在 max1in2DMatrix() 函数中

  • 我们声明一个 maxCount 变量,其中我们存储 0 作为值。

  • 接下来,我们对每一行运行 for 循环。

  • 在 for 循环内部,我们调用 binarySearch() 函数,在该函数中我们查找第一个 1 出现的位置。

  • 最后,我们返回矩阵一行中 maxCount 的值。

示例

这是查找二维矩阵中最大 1 的代码,通过对每一行进行排序并应用二分查找来查找 1 出现的位置,并将该位置从数组的大小中减去,将告诉我们该行中 1 的总数。

package main

import "fmt"

// recursive function to find the pivot point where the first one occurs
// using the binary search and having array and integers as arguments
func binarySearch(array [4]int, l int, r int) int {
    if l <= r {
        // find the midpoint in the current array
        m := l + (r-l)/2
        // condition to see if first one is starting from current index
        if (m == 0 || array[m-1] == 0) && array[m] == 1 {
            return m
        } else if array[m] == 0 {
            return binarySearch(array, m+1, r)
        } else if array[m] == 1 {
            return binarySearch(array, l, m-1)
        }
    }
    return -1
}

// function to find the maximum number of 1 in a row
// having 2D array and int variables as arguments and
// int return type
func max1in2DMatrix(matrix [4][4]int, n int, m int) int {
    // declaring and initializing variable to store max count
    var maxCount int
    maxCount = 0

    // running for loop to iterate over each row of matrix and
    // call binary search function to find the point where 1 is starting
    for i := 0; i < n; i++ {
        // calling the binary search function to find the pivot point
        count := binarySearch(matrix[i], 0, 3)
        if count != -1 && maxCount < 4-count {
            maxCount = 4 - count
        }
    }
    // returning the max count
    return maxCount
}

func main() {
    // creating a 2 dimensional array with 0 and 1 as value
    matrix := [4][4]int{
        {0, 1, 1, 1},
        {0, 0, 1, 1},
        {1, 1, 1, 1},
        {0, 0, 0, 0},
    }

    fmt.Println("Golang program to find the maximum number of 1 in a row using the binary search algorithm.")

    // calling a function with matrix name and size as parameters
    maxCount := max1in2DMatrix(matrix, 4, 4)

    fmt.Println("The maximum number of 1 in the array is", maxCount)
}

输出

Golang program to find the maximum number of 1 in a row using the binary search algorithm.
The maximum number of 1 in the array is 4

结论

这些是查找矩阵一行中最大 1 的两种方法。如果我们比较哪种方法在时间方面更有效,那么当我们使用合适的算法时,时间就会减少,这就是为什么第二种方法更有效,因为我们使用了二分查找算法。要了解有关 Golang 的更多信息,您可以浏览这些教程

更新时间: 2023年7月10日

83 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告