面试题| |求一个数组的连续子数组的最大和

求一个数组的连续子数组的最大和

方法一:暴力求解法

【思路】:

设置一个最大和(max),对于每一个元素都求出其最大的子数组的连续和(tmpMax),然后再与这个最大和进行比较

代码实现:

#include <iostream>
#include <vector>
​
int main()
{
    //有多少个元素个数
    int num = 0;
    std::cin >> num;
    std::vector<int> v;
    v.reserve(num);//对v进行扩容,提高效率
    //输入n个元素,赋值给v
    for (size_t i = 0; i < num; i++)
    {
        int ret = 0;
        std::cin >> ret;
        v.push_back(ret);
    }
    
    //暴力求解法
    int max = -100000;
    for (size_t i = 0; i < num; i++)
    {
        //必须保证每次每一个元素开始的最大值是从0开始的
        int tmpMax = 0;
        for (size_t j = i; j < num; j++)
        {
            tmpMax += v[j];
            if (tmpMax > max)
            {
                max = tmpMax;
            }
        }
    }
    std::cout << max << endl;
    return 0;
}

方法二:动态规划法

采取一个公式:也就是对于MAXv[i] = max(max[i - 1], v[i])。也就是对于到一个元素的位置来说,此时的连续的子数组的最大值可能是其中一个。然后求出来之后在于之前的最大值进行比较再决定

代码实现:

int GetMaxNum(int x, int y)
{
    return x > y ? x : y;
}

int max = v[0];
for (size_t i = 1; i < num; i++)
{	
	int tmpMax = GetMaxNum(tmpMax + v[i], v[i]);
    
    if (tmpMax > max)
    {
        max = tmpMax;
    }
}

std::cout << max << std::endl;

猜你喜欢

转载自blog.csdn.net/qq_40399012/article/details/87312180