[每日算法 - 华为机试] 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值