数据结构与算法分析_数组的子序列问题

来源:互联网 发布:homebrew安装mysql 编辑:程序博客网 时间:2024/05/21 06:37
<span style="font-family:Arial;">/***2.17*求最小子序列和,最小正子序列和,最大子序列乘积**/#include <iostream>#include <algorithm>  using namespace std;#define INT_MIN -32768#define INT_MAX 32767//在里面有使用#define和const定义常量的比较,推荐使用const//#define LEN 10const int LEN = 10;/***最大子序列和**/int subMaxSum(int *a, int length){int thismax = 0, max=INT_MIN;for(int i=0; i<length; i++){thismax += a[i];if(thismax > max){max = thismax;}else if(thismax < 0){thismax = 0;}}return max;}/***最小子序列和*n*/int subMinSum(int a[], int length){int thismin = 0, min = INT_MAX;for(int i=0; i<length; i++){thismin += a[i];if(thismin < min){min = thismin;}else if(thismin > 0){thismin = 0;}}return min;}struct Node  {      int sum;      int xiabiao;        };  int cmp(const Node& t1,const Node& t2)  {      return t1.sum < t2.sum;} /***最小正子序列和*n*logn*/int positiveSubMinSum(int *data, int len){Node* temp = new Node[len];    temp[0].sum = data[0];    temp[0].xiabiao = 0;    for(int i=1;i<len;i++)    {      temp[i].sum = temp[i-1].sum+data[i];      temp[i].xiabiao = i;    }    //对temp.sum[]进行从小到大排序,sum[]中只有相邻的两个数才有可能 得到 最小正子序列和    sort(temp,temp+len,cmp);    int sum = INT_MAX;    for(int i=0;i<len-1;i++)    {      if(temp[i].xiabiao < temp[i+1].xiabiao)      {           if(temp[i+1].sum - temp[i].sum > 0 && temp[i+1].sum - temp[i].sum < sum)           sum = temp[i+1].sum - temp[i].sum;      }    }    delete temp;    temp=0;    return sum;  }void swap(int& a, int& b){ int temp = a; a = b; b = temp;}/***最大子序列乘积(同时也求出了最小的子序列乘积)*在找最大的值得时候,必须记录最小值,因为有负数存在,最小的数可能变成最大的数*/int mutiSubMax(int *a, int length){  int i;    int maxProduct = 1;    int minProduct = 1;    int maxCurrent = 1;    int minCurrent = 1;    for( i=0; i<length ;i++)    {        maxCurrent *= a[i];        minCurrent *= a[i];        if(maxCurrent > maxProduct)             maxProduct = maxCurrent;        if(minCurrent > maxProduct)            maxProduct = minCurrent;        if(maxCurrent < minProduct)            minProduct = maxCurrent;        if(minCurrent < minProduct)            minProduct = minCurrent;        //注意交换        if(minCurrent > maxCurrent)            swap(maxCurrent,minCurrent);        //这个必须在最后(防止为0的时候)        if(maxCurrent<1)            maxCurrent = 1;        //if(minCurrent>1)//这里不需要,因为通过交换即可,只需要一个        //  minCurrent =1;    }    return maxProduct;}int main(){int a[LEN] = {4,-1,5,-2,-1,2,6,-2,1,-3};cout<<"列表:"<<endl;for(int i=0; i<10; i++){cout<<a[i]<<" ";}cout<<endl;cout<<"最大子序列和:"<<subMaxSum(a, LEN)<<endl;cout<<"最小子序列和:"<<subMinSum(a, LEN)<<endl;cout<<"最小正子序列和:"<<positiveSubMinSum(a, LEN)<<endl;cout<<"最大子序列乘积:"<<mutiSubMax(a, LEN)<<endl;return 0;}</span>

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办 空军飞行学员停飞后怎么办 2020年不脱贫的农户怎么办 马自达8停产后配件怎么办 钢铁雄心3没将领怎么办 江苏低于二本线怎么办 电工证快过期了怎么办 天正建筑打不开高版本的图纸怎么办 打开天正只显示cad怎么办 天正软件显示过期了怎么办 四岁宝宝经常吐怎么办 穿越火线登陆不上去怎么办 猫猫呕吐带血怎么办 狗又吐又拉稀怎么办 狗狗肠炎拉血怎么办 拉大便有血怎么办呢 工作中遇到不公待遇怎么办 老兵丢了退伍证怎么办 我的退伍证丢了怎么办 退伍证丢了怎么办啊 银行卡更换之前的卡号怎么办 收到联通欠费催款律师函怎么办