最小正子序列和

来源:互联网 发布:男士刷酸 知乎 编辑:程序博客网 时间:2024/04/28 05:56
#include<stdio.h>//求最小正子序列和//最小正子序列和:1、连续子序列,2、序列和为正且最小 //思路:求出开始的一组子序列:{-2},{-2,11},//{-2,11,-4}, {-2,11,-4,13},{-2,11,-4,13,-5},{-2,11,-4,13,-5,-2} //剩下的子序列必然可以通过上面的这一组子序列相减获得//所以要获得最小正子序列各,必然将上面的序列和排序后的相邻序列和相减所得 //其他方法:究举所有子序列,与最大子序和方法相同, //要记录秩typedef struct node{int value;int rank;}nodes; //快排int quickSort(nodes a[],int low,int high){//int low=0,high=len-1;nodes pivotkey=a[low];while(low<high){while(low<high&&a[high].value>=pivotkey.value) --high;a[low]=a[high];while(low<high&&a[low].value<=pivotkey.value) ++low;a[high]=a[low];} a[low]=pivotkey;return low;} //快排的递归void Qsort(nodes a[],int low,int high){if(low<high){int temp=quickSort(a,low,high);Qsort(a,low,temp);Qsort(a,temp+1,high); }} void getMin(int a[],int len){nodes b[len];//Item *tmp = new Item[len]; int sum=0;for(int i=0;i<len;i++){//b[i]=(nodes)malloc(sizeof(node));sum+=a[i];b[i].value=sum;b[i].rank=i;}//将其排序 O(nlogn) Qsort(b,0,len-1);for(int i=0;i<len;i++){printf("%d rank为%d    ",b[i].value,b[i].rank);}printf("\n");int min=b[0].value>=0?b[0].value:b[len-1].value;for(int i=1;i<len;i++){//必须得够减 if(b[i].rank>b[i-1].rank){int temp=b[i].value-b[i-1].value;if(temp>0&&temp<min){min=temp;}}} printf("最小正序列和为:%d",min);}  int main(){int test[]={-2,11,-4,13,-5,-2};getMin(test,sizeof(test)/sizeof(int)); }

0 0
原创粉丝点击