打开我的题库,调为简单难度。
计算最大子数,直接给我难住。
报错铺满屏幕,凝望没有思路。
缝缝补补做出,击败零个用户。
翻阅评论找补,令我勃然大怒。

打开思维第一步,编写代码求数组,
没有现成的道路,不服就干纸老虎。
为什么要去看每个元素加进来会对当前的子数组造成什么影响?
咱们学会反向思维,看看前面的子数组对当前元素造成什么影响。
若前面的子数组 加上 当前元素 后,值比当前元素小,说明前面的子数组太拉胯,一定是负数,拖了当前元素后腿,要不得。那咱就从这里重新起个头。
若前面的子数组 加上 当前元素 后,值比当前元素大,说明这个子数组做了贡献,要的,带上当前元素一起玩。
还有一点小问题,当前元素是负数,前面的子数组是正数,根据上面的规则,子数组仍然是有贡献,加上去后变小了。
解决方法很简单,记录中间产生的max。
- class Solution {
- public:
- int maxSubArray(vector<int>& nums)
- {
- int res = nums[0];
- int i = 1;
- int max =res;
- while(i
size()) - {
- if(res + nums[i] <= nums[i])
- {
- res = nums[i];
- }
- else
- {
- res += nums[i];
- }
- max = res>max?res:max;
- i++;
- }
- return max;
- }
- };
算法有点拉胯,成绩还算勉强,内功需要加强,还望高人指点。