53最大子序和easy

#53easy
code1:
class Solution {
    public int maxSubArray(int[] nums) {
       int res=Integer.MIN_VALUE,curSum=0;
        for(int num:nums){
            curSum=Math.max(num+curSum,num);
            res=Math.max(curSum,res);
        }
        return res;
    }
}
code2:divide and conquer approach
public class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 0) return 0;
        return helper(nums, 0, nums.length - 1);
    }
    public int helper(int[] nums, int left, int right) {
        if (left >= right) return nums[left];
//int mid=left+(right-left)/2;
        int mid = (left + right) >> 1;
        int lmax = helper(nums, left, mid - 1);
        int rmax = helper(nums, mid + 1, right);
        
        int mmax = nums[mid], t = mmax;
        for (int i = mid - 1; i >= left; --i) {
            t += nums[i];
            mmax = Math.max(mmax, t);
        }
        t = mmax;
        for (int i = mid + 1; i <= right; ++i) {
            t += nums[i];
            mmax = Math.max(mmax, t);
        }
        return Math.max(mmax, Math.max(lmax, rmax));
    }
}
code3:动态规划求解,利用dp数组
//动态规划中包含3个重要的概念:
// 1.最优子结构 2.边界 3.状态转移公式 以跳台阶为例,
//最优子结构为f(10)=f(9) + f(8),边界是f(1)=1, f(2)=2,
//状态转移公式f(n)=f(n-1) + f(n-2)
public class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        int[] dp = new int[len];
        dp[0] = nums[0];

        for (int i = 1; i < len; i++) {
            if (dp[i - 1] >= 0) {
                dp[i] = dp[i - 1] + nums[i];
            } else {
                dp[i] = nums[i];
            }
        }
        // 最后不要忘记全部看一遍求最大值
        int res = dp[0];
        for (int i = 1; i < len; i++) {
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}
code4:精简上面动态规划三
//既然当前状态只与上一个状态有关,我们可以将空间复杂度压缩到 O(1)O(1)O(1)
class Solution {
    public int maxSubArray(int[] nums) {
        int result = nums[0];   // 保存最大的结果
        int sum = 0;            // 保存当前的子序和
        for (int num : nums) {
            if (sum > 0) {     
// sum是正数,意味着后面有机会再创新高,可以继续加
                sum += num;
            } else {          
 // sum是负的,还不如直接从当前位重新开始算,也比(负数+当前值)要大吧
                sum = num;
            }
            result = Math.max(result, sum);   // 每一步都更新最大值
        }

        return result;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇川easy 和 c均是智能投顾系统,它们通过算法分析和机器学习技术,帮助用户进行资产配置和理财规划。 汇川easy是由汇川基金推出的一款互联网智能投顾产品。用户可以根据自己的风险承受能力和投资目标,在汇川easy平台上完成风险评估和资产调整。通过分析用户的投资偏好和市场行情,汇川easy会自动为用户生成个性化的投资组合,并提供定期的投资建议和操作提示。它的特点是操作简单,用户只需注册账户,完成调查问卷和风险测评,即可进行自动化投资。 而c则是建信基金推出的智能投顾产品。c的使用方式和汇川easy相似,用户也需要根据自己的投资需求和风险承受能力进行风险评估和资产配置。根据用户的风险偏好和市场情况,c会为用户生成相应的投资组合,并定期提供投资建议和调整建议。与汇川easy不同的是,c还提供了更加灵活的投资组合选择,用户可以根据自己的喜好和需求进行自由组合。 总的来说,汇川easy和c都是智能投顾产品,通过算法和机器学习技术,帮助用户进行个性化的资产配置和理财规划。用户只需完成风险评估和资产配置,即可享受智能投顾系统带来的便利和专业化的投资建议。这些智能投顾系统的出现,为普通投资者提供了更加便捷和有效的投资选择,也促进了投资理财市场的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值