第四十题 上一题的修改 不只是保存最大值,还要返回结果
要记录 最大的长度,当长度变了或者结果变了就要更新
第一种 忘记优化了,不用每次都更新,只要最后知道位置就能更新 但是可以用来理解 啥时候要更新 以及更新的是哪几个
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// 和上一题类似,但是返回结果变了
// 因为有负数,所以不知道是否要往后加。其实可以知道,如果加上负数,数字小于0了,那么显然就不要加了
int temp=0,max=-100000;
int old_len=0;
int new_len=0;
vector<int> ret_ans;
// 从前向后遍历
for(int i =0;i<array.size();i++)
{
// 如果说 加上了数组中的值,整体变负的了,就说明前面这一串 和后面的数字肯定是分开来的
// 那么就让temp重新开始统计往后的数字
if(temp<0){
new_len=1;
temp=array[i];
}
else{
new_len++;
temp += array[i];
}
// 当temp更大,就要处理返回的结果了
// 即使temp==max,还要判断长度是否比原来长
if(temp>=max)
{
// 若果说结果一样但是长度没原来长,不用处理
// 但是新来的更长 就要更新结果了。
if(old_len<new_len){
ret_ans.clear();
for(int j=0;j<new_len;j++){
// 插入新的结果,最后 在反转
ret_ans.push_back(array[i-j]);
}
reverse(ret_ans.begin(),ret_ans.end());
}
max=temp;
}
}
return ret_ans;
}
};
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// 和上一题类似,但是返回结果变了
// 因为有负数,所以不知道是否要往后加。其实可以知道,如果加上负数,数字小于0了,那么显然就不要加了
int temp=0,max=-100000;
int old_len=0;
int new_len=0;
vector<int> ret_ans;
// 从前向后遍历
for(int i =0;i<array.size();i++)
{
// 如果说 加上了数组中的值,整体变负的了,就说明前面这一串 和后面的数字肯定是分开来的
// 那么就让temp重新开始统计往后的数字
if(temp<0){
new_len=1;
temp=array[i];
}
else{
new_len++;
temp += array[i];
}
// 当temp更大,就要处理返回的结果了
// 即使temp==max,还要判断长度是否比原来长
if(temp>=max)
{
// 若果说结果一样但是长度没原来长,不用处理
// 但是新来的更长 就要更新结果了。
if(old_len<new_len){
ret_ans.clear();
for(int j=0;j<new_len;j++){
// 插入新的结果,最后 在反转
ret_ans.push_back(array[i-j]);
}
reverse(ret_ans.begin(),ret_ans.end());
}
max=temp;
}
}
return ret_ans;
}
};
第二种 算法一样 但是存储返回结果的时候 修改了一下
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// 和上一题类似,但是返回结果变了
// 因为有负数,所以不知道是否要往后加。其实可以知道,如果加上负数,数字小于0了,那么显然就不要加了
int temp=0,max=-100000;
int old_len=0;
int new_len=0;
int point=0;
// 从前向后遍历
for(int i =0;i<array.size();i++)
{
// 如果说 加上了数组中的值,整体变负的了,就说明前面这一串 和后面的数字肯定是分开来的
// 那么就让temp重新开始统计往后的数字
if(temp<0){
new_len=1;
temp=array[i];
}
else{
new_len++;
temp += array[i];
}
// 首先,当temp更大,就要处理返回的结果了
// 其次,如果temp==max,还要判断长度是否比原来长
// 更新一下,保存的结果不用每次都更新,最后一次把要的存进去就好,前面只要保存要保存的位置
// 而且保存结果不需要遍历了一个个存,直接截取array就好了
// 记录下末尾的位置和长度 一会儿返回结果的时候直接截取就好了
if(temp>max || (temp==max && old_len<new_len))
{
// 若果说结果一样但是长度没原来长,不用处理
// 但是新来的更长 就要更新结果了。
point=i;
max=temp;
old_len=new_len;
}
}
// 之前的point是访问数组是确定的,下标0开始,后面要用的话要+1
point++;
// cout<<point<<" "<<old_len<<endl;
// 更新一下,保存的结果不用每次都更新,最后一次把要的存进去就好,前面只要保存要保存的位置
return {array.begin()+point-old_len,array.begin()+point};
}
};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// 和上一题类似,但是返回结果变了
// 因为有负数,所以不知道是否要往后加。其实可以知道,如果加上负数,数字小于0了,那么显然就不要加了
int temp=0,max=-100000;
int old_len=0;
int new_len=0;
int point=0;
// 从前向后遍历
for(int i =0;i<array.size();i++)
{
// 如果说 加上了数组中的值,整体变负的了,就说明前面这一串 和后面的数字肯定是分开来的
// 那么就让temp重新开始统计往后的数字
if(temp<0){
new_len=1;
temp=array[i];
}
else{
new_len++;
temp += array[i];
}
// 首先,当temp更大,就要处理返回的结果了
// 其次,如果temp==max,还要判断长度是否比原来长
// 更新一下,保存的结果不用每次都更新,最后一次把要的存进去就好,前面只要保存要保存的位置
// 而且保存结果不需要遍历了一个个存,直接截取array就好了
// 记录下末尾的位置和长度 一会儿返回结果的时候直接截取就好了
if(temp>max || (temp==max && old_len<new_len))
{
// 若果说结果一样但是长度没原来长,不用处理
// 但是新来的更长 就要更新结果了。
point=i;
max=temp;
old_len=new_len;
}
}
// 之前的point是访问数组是确定的,下标0开始,后面要用的话要+1
point++;
// cout<<point<<" "<<old_len<<endl;
// 更新一下,保存的结果不用每次都更新,最后一次把要的存进去就好,前面只要保存要保存的位置
return {array.begin()+point-old_len,array.begin()+point};
}
};