LeetCode 53.最大子序和

在这里插入图片描述

https://blog.csdn.net/amf12345/article/details/100066857?ops_request_misc=%7B%22request%5Fid%22%3A%22158304627519195239826637%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158304627519195239826637&biz_id=0&utm_source=distribute.pc_search_result.none-task
//介绍了分治、贪心和动态规划

暴力方法:

class Solution
{public:    int maxSubArray(vector<int> &nums){        
	if(nums.size()==0)        
	return 0;//考虑特殊情况:数组中不含有任何元素        
	int max = nums[0];        
	for (int i = 0; i < nums.size(); i++){            
	int sum = 0;            
	for (int j = i; j < nums.size(); j++){                
	sum += nums[j];                
	if (sum > max){                    
	max = sum;                
	}            
	}        
	}
        return max;    
        }
        };

在这里插入图片描述
动态规划法:
思路:已知一个数组A和下一个元素B,和他们的数组A中的元素和B的和为C我们求最大子序和要将C与B进行比较,C>B的时候选择C,B>C的时候选择B,如果在给一个元素D,我们作和分别是:B+D和C+D,要构成最大子序和所以我们要选择B和C中更大的数继续进行加法.
在这里插入图片描述
代码中我们还要使用一个三目运算符来表达取B和C中较大的值


class Solution {public:    int maxSubArray(vector<int>& nums) {        
 if(nums.size() == 0)        
 return 0;//判断数组是否为空        
 vector<int>dp(nums.size(),0);//定义一个数组,长度为nums.size()        
 dp[0] = nums[0];//初始化dp[0]        
 int max = nums[0];//初始化当前最大子序和        
 for(int i = 1;i<nums.size();i++)//i要从1开始因为dp[i-1]中要有元素
 {            
 dp[i]=nums[i]>nums[i]+dp[i-1]?nums[i]:nums[i]+dp[i-1];
 //三目运算符即比较思路中B和C的大小,从而往下继续进行加法            
 if(max<dp[i])            
 max = dp[i];        
 }        
 return max;
    }
    };

在这里插入图片描述
更简单实现的动态规划

Cpp实现

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxF = nums[0],ans = nums[0];
        for(int i = 1;i < nums.size();i++){
            int mx = maxF;
            maxF = max(mx + nums[i],nums[i]);
            ans = max(maxF,ans);
        }
        return ans;
    }
};

在这里插入图片描述
贪心法:


class Solution 
{public:    int maxSubArray(vector<int>& nums) {        
	if(nums.size()==0)        
	return 0;        
	int sum = 0;        
	int result = nums[0];        
	for(int i = 0;i<nums.size();i++){            
	sum += nums[i];            
	result = max(result,sum);            
	//如果sum<0,重新开始找子序组            
	if(sum<0)            
	sum = 0;        
	}        
	return result;    }
	};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值