这是当时我面去哪儿时候面试官让写的代码题,算是最大连续子序列之和的变形吧,当时没写出来~~还是自己太菜!
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <stack> #include <map> #include <queue> using namespace std; int maxSubArray(vector<int>& nums) { int len = nums.size(); int result = nums[0]; int sum = 0; int b[3] = {0}; for (int j = 0;j < len;j++){ //如果序列全为负数,直接找最大的负数 if(result < nums[j]) { result = nums[j] b[1] = j b[2] = b[1] } } if (result > 0){ //序列为正负数或者全是正数 for (int i = 0; i < len; i++) { if (sum<0) //需要丢弃此序列,重新寻找新的连续序列,负数加任何数都是副作用 { sum = 0; b[0] = i; //新的开始,也就是起始位置下标 } sum += nums[i]; if (sum>result) { b[2] = b[0] //b[2]最大连续子序列的开始下标 b[1] = i; //最大和的末尾位置,也就是在不进行sum和result替换之前的最大和的下标 result = sum; } } } //并将起始位置的下标打印出来 cout <<"begin:"<< b[2] <<" end:"<< b[1] << endl; return result; } int main() { int n; cin >> n; vector<int> nums(n); for(int i = 0;i < n;i++) { cin >> nums[i]; } cout << maxSubArray(nums) << endl; }