美文网首页
最大子数组

最大子数组

作者: 稀饭粥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);
        }
    }
    

    相关文章

      网友评论

          本文标题:最大子数组

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