前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer——连续子数组的最大和

剑指offer——连续子数组的最大和

作者头像
AI那点小事
发布2020-04-20 14:05:09
3610
发布2020-04-20 14:05:09
举报
文章被收录于专栏:AI那点小事AI那点小事

概述

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)


思路

这是一道典型的动态规划的题目。但是要事先对数组进行检查是否全小于0,若全小于0,则输出数组元素的最大值,反之利用动态规划求解。


C++ AC代码

代码语言:javascript
复制
#include <vector>
#include <queue>
using namespace std;

class Solution {
    public:
        struct cmp{
            bool operator ()(int a,int b)const{
                return a<b; 
            }       
        };
        bool check(vector<int> array){
            bool flag = true;
            for(int i = 0 ; i < array.size() ; i++){
                if(array[i] >= 0){
                    flag = false;
                    break;
                }
            }
            return flag;
        }

        int FindGreatestSumOfSubArray(vector<int> array) {
            if(check(array) == true){
                priority_queue<int,vector<int>,cmp> q;
                for(int i = 0 ; i < array.size() ; i++){
                    q.push(array[i]);
                }
                return q.top();
            }
            int max = 0;
            int tmp = 0;
            for(int i = 0 ; i < array.size() ; i++){
                tmp += array[i];
                if(max < tmp){
                    max = tmp;
                }else if(tmp < 0){
                    tmp = 0;
                }
            }
            return max;
        }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 思路
  • C++ AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档