leetcode 每日刷题 ——53,70, 121

12.53.最大子序和

/**
 * @author mys
 * @version 2019.9.16
 * 最大子序和
 * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
 *
 * 示例:
 * 输入: [-2,1,-3,4,-1,2,1,-5,4],
 * 输出: 6
 * 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
 */


package com.mys.db;

import org.junit.Test;

public class MaxSubArray53 {
    public int maxSubArray(int[] nums) {
        int res = nums[0];
        int sum = 0;
        for (int num : nums) {
            if (sum > 0) {
                sum += num;
            } else {
                sum = num;
            }
            res = Math.max(sum, res);
        }
        return res;
    }
    @Test
    public void fun() {
        int [] nums = {-2,1,-3,4,-1,2,1,-5,4};
        System.out.println("最大子序和:" + maxSubArray(nums));
    }
}

13.70.爬楼梯

/**
 * @author mys
 * @version 2019.9.16
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 *
 * 爬上 n-1 阶楼梯 => 再爬1阶到n阶
 * 爬上 n-2 阶楼梯 => 再爬2阶到n阶
 * dp[n] = dp[n-1] + dp[n-2]
 */


package com.mys.db;

import org.junit.Test;

public class ClimbStairs70 {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
//        dp[1] = 1//走一阶有1种走法
//        dp[2] = 2;//走两阶有2种走法
//        for (int i = 3; i <= n; i ++) {
//            //dp[n] = dp[n-1] + dp[n-2]
//            dp[i] = dp[i - 1] + dp[i - 2];
//        }
        dp[0] = 1;//比前面从1开始更快,内存使用更少,并无实际意义
        dp[1] = 1;
        for (int i = 2; i <= n; i ++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

    @Test
    public void fun() {
        System.out.println(climbStairs(4));
    }
}

14.121.股票最大收益

/**
 * @author mys
 * @version 2019.9.16
 *
 * 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
 * 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
 * 注意你不能在买入股票前卖出股票
 *
 * 前i天最大收益 = max{前 i-1 天最大收益, 第i天价格 - 前 i-1 天最小价格}
 */


package com.mys.db;

import org.junit.Test;

public class MaxProfit121 {
    public int maxProfit(int[] prices) {
        if (prices.length <= 1) {
            return 0;
        }
        int max = 0;
        int min = prices[0];
        for (int price : prices) {
            max = Math.max(max, price - min);
            min = Math.min(min, price);
        }
        return max;
    }

    @Test
    public void fun() {
        int[] prices = {7,1,5,3,6,4};
        System.out.println(maxProfit(prices));
    }
}

你可能感兴趣的:(leetcode)