[每日算法 - 华为机试] leetcode53 :最大子数组和 「算法中的哲学」

 入口

53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/

题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

 

示例 1:

        输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
        输出:6
        解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:

        输入:nums = [1]
        输出:1
示例 3:

        输入:nums = [5,4,-1,7,8]
        输出:23

方法一:贪心

方法思路:若当前指针之前元素和小于当前元素,则丢弃之前元素。

leetCode热评 道题目的思想是: 走完这一生 如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。 我回顾我最光辉的时刻就是和不同人在一起,变得更好的最长连续时刻

import java.lang.Math;
class Solution {
    public int maxSubArray(int[] nums) {
        int maxNum = nums[0], curNum = nums[0];
        for(int i=1;i<nums.length;i++){
            //’ nums[i] ‘就是新人,他的出现能让我俩比旧人更久的相处更好
            curNum = Math.max(nums[i],curNum + nums[i]);//不再计算之前元素的和,不就是一种抛弃
            maxNum = Math.max(curNum,maxNum); //以后的和都是和新的人计算
        }
        return maxNum;
    }
}

空间复杂度:O(N)

时间复杂度:  O(1)

方法二:动态规划

方法思路:若前一个元素大于0,则将其加到当前元素上。这就想阿德勒心理学中的目的论:我不会受过去影响,我选择了现在的我,只有过去是正向的,才会是我的一部分!

import java.util.Arrays;
class Solution {
    public int maxSubArray(int[] nums) {
       for(int i = 1;i<nums.length;i++){
           //阿德勒心理学:目的论(我不会受过去影响,我选择了现在的我)
           if(nums[i-1] > 0) nums[i] = nums[i-1]+nums[i];//只有过去是正向的,才会是我的一部分
       }
       Arrays.sort(nums);
       return nums[nums.length-1];
    }
}

空间复杂度:O(N)

时间复杂度:  O(1)

posted @ 2023-07-03 14:54  yihuiComeOn  阅读(15)  评论(0)    收藏  举报  来源