zoukankan      html  css  js  c++  java
  • [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))

    收藏一下,请直接点击原帖地址:http://blog.csdn.net/hpf911/article/details/9275583
    这是《剑指Offer》中的一道题目,数组中的元素可能是正负,所以连续的子组求和,会变大也可能变小,解题时首先要求当前的和(初始值为0)和下一个元素求和后,如果是负的,那么重新置0和下下个继续求和,首先要找到使和增加的正的元素。然后有了当前最大的和后,纪录下来;继续累加求和,若新增的元素使和变为负数,那么重新置0,按这个逻辑找出剩余元素的一个最大子组和,若超过前纪录,覆盖,直到子组遍历结束。(动态规划解题方法就是首先想好整个事件发展的逻辑,比如Sn和Sn-1,Sn-2的关系,然后可以用递归思想,或者数学上的归纳法得到事件发展规律,但是动态规划不同于递归的高复杂度的开销,它将有用的子结果纪录到表中,以部分空间来节约时间)下面代码为置顶链接的原帖作者的代码。

    
    public class FindMaxSumOfSubArray {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            FindMaxSumOfSubArray f = new FindMaxSumOfSubArray();
            int[] arr = { 1, -2, 3, 10, -4, 7, 2, -5 };
            System.out.println("MaxSum:" + f.findMaxSum(arr));
        }
    
        public Integer findMaxSum(int[] arr) {
            int curSum = 0;
            int maxSum = 0;
            int len = arr.length;
    
            if (arr == null || len == 0) {
                return null;
            }
    
            for (int i = 0; i < len; i++) {
                curSum += arr[i];
                if (curSum < 0) {
                    curSum = 0;
                }
                if (curSum > maxSum) {
                    maxSum = curSum;
                }
            }
    
            // all data are negative
            if (maxSum == 0) {
                for (int i = 0; i < len; i++) {
                    if (i == 0) {
                        maxSum = arr[i];
                    }
                    if (arr[i] > maxSum) {
                        maxSum = arr[i];
                    }
                }
            }
            return maxSum;
        }
    }
    
  • 相关阅读:
    01背包问题需要找出相应路径
    单链表的正序输出和逆序输出
    二叉树之叶子节点个数
    01背包问题
    STL之map和multimap(关联容器)
    python的tips:字符和字符串的问题
    postman的使用(转载)
    python tips(3);import的机制
    python每日一类(5):itertools模块
    python每日一类(4):slice
  • 原文地址:https://www.cnblogs.com/zhangdebin/p/5567884.html
Copyright © 2011-2022 走看看