连续数组最大和 (二维数组)

public void getMaxSubArray(int[][]array){

        int row = array.length;
        int width = array[0].length;
        int[][] fe = new int[row+1][width+1];
        for(int i=1;i<=row;i++){
            for(int j=1;j<=width;j++){
                fe[i][j] = fe[i][j-1] + fe[i-1][j] - fe[i-1][j-1] + array[i-1][j-1];
            }
        }

        int finalMax =0,finalLow = -1,finalHigh = -1,finalB = -1,finalE = -1;

        for(int low=0;low<row;low++){
            for(int high=low+1;high<=row;high++){
                int max = 0,sum = 0,b=-1,bt=-1,e=-1;
                for(int j=1;j<=width;j++){
                    sum += getValue(fe,low,high,j);

                    if(sum>max){
                        max = sum;
                        e = j - 1;
                        b = bt;
                    }
                    if(sum<0){
                        sum = 0;
                        bt = j - 1;
                    }
                }
                if(max>finalMax){
                    finalMax = max;
                    finalB = b;
                    finalE = e;
                    finalHigh = high-1;
                    finalLow = low-1;
                }
            }
        }

        for(int i=finalLow+1;i<=finalHigh;i++){
            for(int j=finalB+1;j<=finalE;j++){
                System.out.print(array[i][j]+ ",");
            }
            System.out.println("");
        }
    }

    public int getValue(int[][]fe,int low,int high,int col){
        return fe[high][col] - fe[low][col] - fe[high][col-1] + fe[low][col-1];
    }

    public static void main(String[]args){
        MaxSubArrayII arrayII = new MaxSubArrayII();
        arrayII.getMaxSubArray(new int[][]{
                {1,-10,-11},
                {4,-95,6},
                {7,8,9}
        });
    }
转载:https://blog.youkuaiyun.com/zhumingyuan111/article/details/80193595
<think>好的,我现在需要帮助用户解决如何通过数组指针在C/C++中找到二维数组最大值的问题。首先,我得回忆一下二维数组在内存中的存储方式。根据引用[2]提到的,二维数组是按行连续存储的,所以可以用指针遍历所有元素。 用户提到要使用数组指针,这里需要明确数组指针的定义。数组指针是指向数组的指针,比如int (*ptr)[n],指向一个含有n个元素的数组。这样的话,可以通过指针的移动来访问不同的行,然后在每行内部遍历元素。 接下来,考虑如何遍历二维数组。假设二维数组是int arr[rows][cols],那么数组指针ptr指向arr的第一个行,即ptr = arr。然后,通过ptr+i可以访问第i行,再通过*(ptr+i)+j访问第i行第j列的元素。或者也可以将二维数组视为一维数组,因为内存是连续的,这样可能更简单。 然后是如何比较元素的大小。初始化一个max变量,赋值为第一个元素的值,然后遍历每个元素,如果当前元素大于max,则更新max。需要注意的是指针越界的问题,确保遍历的范围不超过数组的行数和列数。 还需要考虑如何传递二维数组给函数。在C中,二维数组作为参数传递时,需要指定列的大小,或者使用指针的形式。这里用户提到用数组指针,所以在函数参数里应该使用数组指针的形式,比如int (*ptr)[cols]。 现在,将这些思路转化为具体的代码步骤。首先定义数组指针,指向二维数组。然后使用双重循环遍历每个元素,比较并更新最大值。注意循环的终止条件,行数rows和列数cols需要作为参数传入,或者在数组定义时已知。 可能遇到的错误包括指针运算不正确导致访问错误的内存位置,或者列数未正确指定导致指针移动的步长错误。例如,如果数组指针声明为int (*ptr)[cols],那么ptr+1会移动cols*sizeof(int)个字节,正确指向下一行。 最后,测试代码是否正确。可以创建一个测试用的二维数组,手动计算最大值,然后运行程序验证结果是否正确。同时,考虑边界情况,比如所有元素相同的情况,或者最大值为负数的情形。 总结步骤: 1. 声明并初始化二维数组。 2. 定义数组指针,指向该二维数组。 3. 初始化max变量为第一个元素。 4. 使用双重循环遍历每个元素,比较并更新max。 5. 返回max值。 在代码实现中,需要注意正确的指针解引用和数组索引的转换。例如,*(*(ptr + i) + j)相当于arr[i][j]。同时,确保循环变量i和j的范围正确,避免越界访问。 另外,根据引用[3]提到的,如果数组非常大,可能会有栈溢出的问题,这时候可能需要动态分配内存。但用户的问题中没有提到数组大小的问题,所以假设是普通大小的二维数组。 现在,把这些思考整理成代码示例和解释,确保语法正确,并符合用户的要求,使用数组指针来实现。</think>### 通过数组指针查找二维数组最大值的实现方法 在C/C++中,二维数组的内存是连续存储的,可以通过数组指针遍历所有元素。以下是具体实现步骤: #### 1. 定义数组指针并初始化 假设二维数组为 `int arr[3][4]`,声明数组指针 `int (*ptr)[4] = arr`,指向数组首行。 #### 2. 遍历二维元素并比较 通过双重循环遍历所有元素,记录最大值: ```c #include <stdio.h> int findMax(int (*ptr)[4], int rows, int cols) { int max = ptr[0][0]; // 初始化为第一个元素 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (*(*(ptr + i) + j) > max) { // 等价于 ptr[i][j] max = *(*(ptr + i) + j); } } } return max; } int main() { int arr[3][4] = {{5, 2, 9, 1}, {3, 8, 4, 6}, {0, 7, 2, 5}}; int (*ptr)[4] = arr; // 数组指针指向二维数组 int max = findMax(ptr, 3, 4); printf("最大值为: %d\n", max); // 输出9 return 0; } ``` #### 关键点说明 - **数组指针定义**:`int (*ptr)[4]` 表示指针指向包含4个整数的数组,与二维数组的列数一致[^2]。 - **指针运算**:`ptr + i` 移动的步长为 `4 * sizeof(int)`,直接定位到第i行。 - **元素访问**:`*(*(ptr + i) + j)` 通过解引用操作获取元素值,等价于 `arr[i][j]`。 #### 动态分配场景(避免栈溢出) 若二维数组较大(如100万元素),需使用动态内存分配[^3]: ```c int **ptr = new int*[rows]; for (int i = 0; i < rows; i++) { ptr[i] = new int[cols]; } // 后续操作与静态数组类似 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值