Maximum Subarray(最大子数组)

Maximum Subarray

我的思路:

1、以前是有做过hdoj上一个最长递增子序列的,想想那个比较麻烦,然后我使用和卖股票一样的算法。还把数组转换了一次,想想真是傻。

2、下面是我要丑哭的代码。实在不想贴出来。

    int maxSubArray(int A[], int n) {
        if (n < 0)
            return 0;
        int input[n];
        
        input[0] = A[0];
        for (int i = 1; i < n; i++)<span style="white-space:pre">	</span>//这里是把数组转换成和卖股票一样的,别人的代码就没有转,直接使用累加和来计算
            input[i] = input[i - 1] + A[i];

        int sum = 0;
        int min = 0, min_i = -1;<span style="white-space:pre">	</span>//转换之后第一个数设定为0,也就是最前面的减数
        for (int i = 0; i < n; i++) 
            if (min > input[i]) {
                min = input[i];
                min_i = i;
            }
            else
                if (input[i] - min > sum)
                    sum = input[i] - min;
        if (min_i >= 0 && A[min_i] > 0)
            return sum + A[min_i];
        else if (sum == 0) {<span style="white-space:pre">		</span>//sum等于0就说明数列中所有数都小于0,最大的数就可以完成目标
            int max = A[0];
            for (int i = 1 ; i < n ; i++)
                if (max < A[i])
                    max = A[i];
            return max; 
        }
        return sum;
    }


别人思路:

1、这题就是用的卖股票的思路。不过别人思路比我要清晰很多。

    int maxSubArray(int A[], int n) {
        if (n < 0)
            return 0;
        
        int sum = 0, ans = 0;
        for (int i = 0; i < n; i++) {
            sum += A[i];
            if (sum < 0)
                sum = 0;
            if (sum > ans)
                ans = sum;
        }
        if (ans == 0) {
            ans = A[0];
            for (int i = 0; i < n; i++) 
                if (A[i] > ans)
                    ans = A[i];
        }
        return ans;
    }
参考链接: 最大子数组算法


下面的参考链接是关于最长递增子序列的求法:最长递增子序列


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值