卡丹尔算法(max subarray problem)

本文介绍了卡丹尔算法,用于解决在给定数组中找到最大利润的股票交易问题。通过动态规划的方法,算法将复杂度降低到线性级别。文章详细解析了算法思路,并给出了实现代码,解决寻找连续子数组最大和的问题。
摘要由CSDN通过智能技术生成

问题介绍

Say you have an array for which the ith element is the price of a
given stock on day i. If you were only permitted to complete at most
one transaction (ie, buy one and sell one share of the stock), design
an algorithm to find the maximum profit.

抽象出来就是找到一个数组nums[0,n]的子数组 nums[i, j] (0 <=i < j <= n) 使得 nums[j] - nums[i]取得最大值。当然可以直接使用暴力解法,复杂度为O(n*n)。但是有一个更为聪明的办法,可以将复杂度降解为O(n), 这就是非常有名的卡丹尔算法。求解思路很简洁,本质是动态规划的思想,只需要维护一个dp数组,记录子数组结束于当前位置i时的最大值, 因为一定要包含位置i, 故有dp[i] = dp[i - 1] + nums[i] - nums[i - 1]。根据题意有dp[i]的最小值是0,因此 dp[i] = max(0, dp[i - 1] + nums[i] - nums[i - 1]),遍历dp数组找到一个最大值即可。可以进一步进行优化,在扫描nums数组的时候使用max_ending_here表示dp[i], 使用max_so_far维护max_ending_here所有出现的值中的最大值,从而将空间复杂度从O(n)降解为O(1)

求解

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int * newIntRaw(int n)
{
    <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值