美文网首页
最大子数组

最大子数组

作者: 稀饭粥95 | 来源:发表于2018-08-21 11:26 被阅读13次

最大子数组(lintcode 41)

描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6
要求时间复杂度为O(n)

public class Solution {
    /**
     * @param nums: A list of integers
     * @return: A integer indicate the sum of max subarray
     */
   public int maxSubArray(int[] nums) {
        int max = Integer.MIN_VALUE;
        int sum = 0;
        for(int i=0;i<nums.length;i++){
            sum = sum + nums[i];
            if(sum>max) max=sum;//注意顺序
            if(sum<0){
                sum = 0;
            }
            
        }
        return max;
    }
}

最大子数组 II(lincode42)

描述 :给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。返回最大的和。

public class Solution {
    /*
     * @param nums: A list of integers
     * @return: An integer denotes the sum of max two non-overlapping subarrays
     */
    public int maxTwoSubArrays(List<Integer> nums) {
        // write your code here
        int pre[]= new int[nums.size()];  
        int back[]=new int[nums.size()];
        int sum =0;
        int max = Integer.MIN_VALUE;
        for(int i=0;i<nums.size();i++){
            sum = sum + nums.get(i);
            if(sum>max) max = sum;
            if(sum<0) sum=0;
            pre[i] = max;
        }
        sum = 0;
        max = Integer.MIN_VALUE;
        for(int i=nums.size()-1;i>=0;i--){
            sum = sum + nums.get(i);
            if(sum>max) max = sum;
            if(sum<0) sum=0;
            back[i] = max;
        }
        max=Integer.MIN_VALUE;
        for(int i=0;i<nums.size()-1;i++){
            sum = pre[i]+back[i+1];
            if(sum>max) max = sum;
        }
        return max;
    }
}

买卖股票的最佳时机 III

描述:假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。

public class Solution {
    /**
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    public int maxTwoSubArrays(int nums[]) {
        // write your code here
        int pre[]= new int[nums.length];  
        int back[]=new int[nums.length];
        int sum =0;
        int max = Integer.MIN_VALUE;
        for(int i=0;i<nums.length;i++){
            sum = sum + nums[i];
            if(sum>max) max = sum;
            if(sum<0) sum=0;
            pre[i] = max;
        }
        sum = 0;
        max = Integer.MIN_VALUE;
        for(int i=nums.length-1;i>=0;i--){
            sum = sum + nums[i];
            if(sum>max) max = sum;
            if(sum<0) sum=0;
            back[i] = max;
        }
        max=Integer.MIN_VALUE;
        for(int i=0;i<nums.length-1;i++){
            sum = pre[i]+back[i+1];
            if(sum>max) max = sum;
        }
        if(max<pre[nums.length-1]) max = pre[nums.length-1];//可以选择买一个
        if(max<0) max=0;//可以选择不买
        return max;
    }
    
     public int maxProfit(int[] prices) {
         if(prices.length<=1) return 0;
         int s[] = new int[prices.length-1];
         for(int i=1;i<prices.length;i++){
             s[i-1] = prices[i]-prices[i-1];
         }
         return maxTwoSubArrays(s);
     }
}

最接近零的子数组和(lintcode139)

描述:给定一个整数数组,找到一个和最接近于零的子数组。返回第一个和最右一个指数。你的代码应该返回满足要求的子数组的起始位置和结束位置

public class Main{
    class Pair{
        int val;
        int x;
        public Pair(int val,int x){
            this.val = val;
            this.x = x;
        }
    }
    public int[] subarraySumClosest(int[] nums) {
        int [] out = new int[2];
        Pair []s = new Pair[nums.length];
        int sum=0;
        for(int i=0;i<nums.length;i++){ 
            sum = sum + nums[i];
            Pair p = new Pair(sum,i);
            s[i] = p;
        }
        Arrays.sort(s,new Comparator<Pair>(){
            public int compare(Pair a, Pair b){
                return a.val-b.val;
            }
        });
        int min = Integer.MAX_VALUE;
        for(int i=1;i<nums.length;i++){
            int minor = s[i].val-s[i-1].val;
            if(minor<min){
                min = minor;
                //判断c[i],c[i-1]的大小,找到对应的分段
                if(s[i].x>s[i-1].x){
                    out[1] = s[i].x;
                    out[0] = s[i-1].x+1;
                }else{
                    out[0] = s[i].x+1;
                    out[1] = s[i-1].x;
                }
                
            }
        }
        System.out.println(out[0]+" "+out[1]);
        return out;
    }
    
    public static void main(String[] args)  {
        Main m = new Main();
        m.subarraySumClosest(new int[]{-3, 1, 1, -3, 5});
        //System.out.println(a);
    }
}

相关文章

  • 动态规划

    求最大子数组,最大子乘积

  • Leetcode-Medium 152. Maximum Pro

    题目描述 给定一个整数数组nums(有正有负),求最大子数组乘积 思路 求最大子数组乘积问题是求最大子数组之和演变...

  • LeetCode-152-乘积最大子数组

    LeetCode-152-乘积最大子数组 152. 乘积最大子数组[https://leetcode-cn.com...

  • 10《算法入门教程》分治算法之最大子数组问题

    1. 前言 本节内容是分治算法系列之一:最大子数组问题,主要讲解了什么是最大子数组问题,如何利用分治算法解决最大子...

  • 最长子序列问题

    最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5...

  • 53. 最大子序和

    题目链接: 53. 最大子序和 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最...

  • Leetcode 53 最大子序和

    最大子序和 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最...

  • 分治算法解最大子序列和问题

    最大子序列和问题 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最...

  • 刷leetCode算法题+解析(六)

    最大子序和 题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最...

  • 最大子数组问题

    最近在看算法导论,看到计算最大子数组问题,于是写了一个iOS版本的。 利用分治策略,逐层寻找 最大子数组存在三种情...

网友评论

      本文标题:最大子数组

      本文链接:https://www.haomeiwen.com/subject/qoediftx.html