严格递增矩阵

在C论坛上逛,发现了这样一个题,挺有意思的, 决定自己编一下。


1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增

1 2 3

3 5 6

4 8 9

现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)


这个题显然要用折中寻找发,时间复杂度为(log2n)

#include <iostream>
using namespace std;

bool FindItem( int[][] M, int value, int RowStart, int RowEnd, int ColStart, int ColEnd )
{
    if( RowEnd <= RowStart || ColEnd <= ColStart )
    {
        return false ;
    }

    int RowMid = (RowStart + RowEnd)/2 ;
    int ColMid = (ColStart + ColEnd)/2 ;
    int MidValue = M[RowMid][ColMid];

    if( value == MidValue )
    {
        return true ;
    }
    else if( value > MidValue )
    {
        return FindItem( M, value, RowMid + 1, RowEnd, ColStart, ColMid - 1 ) // bottom left
            || FindItem( M, value, RowMid, RowEnd, ColMid, ColEnd) // bottom right
            || FindItem( M, value, RowStart, RowMid - 1, ColStart + 1, ColEnd); // top right
    }
    else
    {
        return FindItem( M, value, RowMid + 1, RowEnd, ColStart, ColMid - 1 ) // bottom left
            || FindItem( M, value, RowStart, RowMid, ColStart, ColMid) // top left 
            || FindItem( M, value, RowStart, RowMid - 1, ColStart + 1, ColEnd); // top right
    }
}


### Java算法实现:使矩阵每列严格递增所需的最少操作次 为了实现在Java中找到使矩阵每一列都严格递增所需要的最小操作量,可以采用贪心策略来解决问题。对于给定的一个整矩阵`matrix`,目标是通过增加某些元素使得每一列中的值都是严格上升的。 #### 方法概述 该方法的核心在于逐行遍历并记录当前处理到的最大值,在遇到不满足条件的情况时更新计器以及调整最大值列表以适应新的约束[^1]。 #### 实现细节 下面是一个具体的解决方案: ```java import java.util.*; public class MatrixColumnIncrement { public static int minOperations(int[][] matrix) { if (matrix.length == 0 || matrix[0].length == 0) return 0; int rows = matrix.length, cols = matrix[0].length; List<Integer> maxInCols = new ArrayList<>(Collections.nCopies(cols, Integer.MIN_VALUE)); int operationsCount = 0; for (int row = 0; row < rows; ++row){ for (int col = 0; col < cols; ++col){ if(matrix[row][col] <= maxInCols.get(col)){ // Increment operation count when adjustment is required. operationsCount += Math.abs(maxInCols.get(col) - matrix[row][col]) + 1; matrix[row][col] = maxInCols.get(col) + 1; } // Update maximum value encountered so far in current column. maxInCols.set(col, Math.max(maxInCols.get(col), matrix[row][col])); } } return operationsCount; } public static void main(String[] args) { int[][] matrix = {{1,2,3},{2,2,4},{3,2,5}}; System.out.println(minOperations(matrix)); // Output should be the minimal number of changes made. } } ``` 此程序定义了一个名为 `minOperations` 的函,它接收一个二维组作为参,并返回将所有列变为严格递增序列所需执行的操作目。此外还提供了一个简单的测试案例用于展示如何调用上述功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值