题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)

思路:先确定子数组有多少种情况,这里按照以数组中的每个数为结尾进行分组,所以共有arr.length种情况,所以需要用一个数组int[nums.length]来存储子数组的和的最大值。如何确定以arr[i]为结尾的的子数组的和的最大值?此时可分为两种情况,第一种情况是arr[i]自己,第二种情况就是arr[i]+以arr[i-1]为结尾的子数组和的最大值

public class Solution4_15 {
    public static int maxSubArray(int[] nums) {
        int[] arr = new int[nums.length];
        arr[0] = nums[0];
        int max = arr[0];
        for (int i = 1; i < nums.length; i++) {
            //两种情况进行比较
            arr[i] = Math.max(arr[i - 1] + nums[i], nums[i]);
            //获取arr中的最大值
            max = Math.max(max, arr[i]);
        }
        return max;
    }
}

题目:给定一个长度为n的整数数组height。有n条垂线,第 i 条线的两个端点是(i, 0)和(i, height[i])。
找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

思路:这题的意思就是求两根柱子围成的矩形面积(以短的那条为边)。定义两个指针i,j指向数组的头和尾,所求面积就是Math.min(height[i], height[j]) * (j - i),之后移动短的那条指针,为什么?因为矩形的面积由短的那边确定,而每一次移动指针都会减少矩形的低,假设i<j,此时以i为边的矩形的最大面积已经求出来了,所以要i++,否则就是j--

public class solution4_18 {
    public static int maxArea(int[] height) {
        int i = 0, j = height.length - 1, s = 0;
        while (i < j) {
            s = Math.max(s, Math.min(height[i], height[j]) * (j - i));
            if (height[i] < height[j]) i++;
            else j--;
        }
        return s;
    }
}

posted on 2023-04-23 17:25  雨霁留虹霓  阅读(27)  评论(0)    收藏  举报