笔试最长子数组和最大子矩阵c#

今天笔试题记录下

1。最长和为0的子数组,例如1,2,3,-2,4,-3,2,-4,-2,0,6,7结果是2,3,-2,4,-3,2,-4,-2,0

大致思想是用递归的做法:如果一个序列自身不是最长的和为0的子数组,那么就比较这个序列去掉左边一位和去掉右边一位的两个序列中最长的最长子数组。

不过时间复杂度应该是n+2(n-1)+2(n-2)+....+2*1=O(n^2),回头想想有没有更高效的做法。

public static int[] getresult(int [] array,int start,int end)
        {
            int[] result = new int[2];
            result [1]=-1;
            int temp = 0;
            if(start>end)
                return result;
            for (int i = start; i <= end; i++)
            {

                temp += array[i];
            }
            if (temp == 0)
            {
                result[0] = start;
                result[1] = end;
                return result;
            }
            int[] Lresult = getresult(array, start, end - 1);
            int[] Rresult = getresult(array, start+1, end);
            return  (Lresult[1] - Lresult[0]) > (Rresult[1] - Rresult[0]) ? Lresult : Rresult;
        }

2。求矩阵的2*2的子矩阵里所有元素和最大的。

全部遍历一遍求解

public static int getresult(int[][] array,int m,int n)
        {
            if(m<2||n<2)
                return array [0][0];
            int max=array[0][0]+array[0][1]+array[1][0]+array[1][1] ;
            for(int i=1;i<m;i++)
                for (int j = 1; j < n; j++)
                {
                    if (max < array[i][j] + array[i - 1][j] + array[i][j - 1] + array[i - 1][j - 1])
                        max = array[i][j] + array[i - 1][j] + array[i][j - 1] + array[i - 1][j - 1];
                }
            return max;

        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值