最大子序和(简单+进阶)

蹲街弑〆低调 提交于 2020-03-01 08:47:04

总共4种方法,有贪心法、分治法和动态规划,还有一种最笨的,分治法主要是把问题分成小问题进行解决,再对小问题的和进行综合处理,贪心法和动态规划法相同

简单 方法一:这个方法最愚蠢,用i,j当起始结束标志

int maxSubArray(int* nums, int numsSize){
	int i,j,s,max=nums[0];
	for(i=0;i<numsSize;i++){
		s=0;
		for(j=i;j<numsSize;j++){
			s+=nums[j];
			if(s>max){
				max=s;
			}
		}
	}
	return max;
}

方法二:贪心法,涉及到三个变量,在当前位置的最大和cur_sum,整体最大和max_sum

1.首先设置在0位置,当前最大和为nums[0],题目要求子数组最少包含一个元素

2.当遍历到i位置,当前和是加上之前的元素大,还是只保留本元素大

3接着判断在当前元素的和是否大于max决定是否更新max

int maxSubArray(int* nums, int numsSize){
	int cur_sum=nums[0],max_sum=nums[0],i;
	for(i=0;i<numsSize;i++){
		cur_sum=(cur_sum+nums[i])>nums[i]?(cur_sum+nums[i]):nums[i];
		max_sum=cur_sum>max_sum?cur_sum:max_sum;
	}
	return max_sum;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!