从数组标零开始走,依次开始累加,累加值必需大于等于零,当累加值等于零则停止,求最长可以走多远。
另一种情况可以取两个链表双循环来更新最长链表长度。
思路:不断以后续最接近0的负数,取代之前加过的更远离0的负数,用链表来操作。
//输入
{5,-4,-1,-1,-2,-1,-1,-1,-8};
{5,-1,-1,-1,2,1,-1};
{12,-11,1,-1,-10};
//输出
5 -1 -1 -1 -1 -1
6
5 -1 -1 -1 2 1 -1
7
12 1 -1 -10
4
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <numeric>
using namespace std;
int maxofpath(vector<int> &data,int n)
{
std::list<int> result;
std::list<int>::iterator it;
bool flag = true;
int sum = data[0];
result.clear();
result.push_back(data[0]);
for (int j = 0 + 1; j < n; j++)
{
if ((sum += data[j]) > 0)
{
result.push_back(data[j]);
}
else
{
sum -= data[j];
for(it = result.begin();it != result.end(); it++)
{
if(*it<data[j])
{
sum = sum - *it + data[j];
result.erase(it);
result.push_back(data[j]);
flag = false;
}
}
if(flag && (sum+= data[j]) == 0)
result.push_back(data[j]);
flag = true;
}
}
for(it = result.begin(); it != result.end(); it++)
cout<<*it<<" ";
cout<<endl;
return result.size();
}
int main()
{
vector<int> data = {5,-4,-1,-1,-2,-1,-1,-1,-8};
vector<int> data1 = {5,-1,-1,-1,2,1,-1};
vector<int> data2 = {12,-11,1,-1,-10};
cout<<maxofpath(data,data.size())<<endl;
cout<<maxofpath(data1,data1.size())<<endl;
cout<<maxofpath(data2,data2.size())<<endl;
return 0;
}