2.设计包含min 函数的栈。3.求子数组的最大和

来源:互联网 发布:鲁班软件 上市 编辑:程序博客网 时间:2024/06/14 07:47
/*2.设计包含 min  函数的栈。定义栈的数据结构,要求添加一个 min  函数,能够得到栈的最小元素。要求函数 min、push  以及 pop  的时间复杂度都是 O(1)。思路:使用一个辅助栈来保存最小元素,该辅助栈名字为minimum stack,其栈顶元素为当前栈中的最小元素。要获取当前栈中最小元素,只需要返回minimum stack的栈顶元素即可。每次执行push操作,检查push的元素是否小于或等于minimum stack栈顶元素。如果是,则也push该元素到minimum stack中。当执行pop操作的时候,检查pop的元素是否与当前最小值相等。如果相同,则需要将改元素从minimum stack中pop出去。 */#include<iostream>#include<stdio.h>#include<stack>using namespace std;struct StackGetMin{stack<int> element;stack<int> minStack;void push(int x){element.push(x);//push的元素小于当前minStack的最小元素,则push到minStack中if(minStack.empty() || x<=minStack.top())minStack.push(x);}bool pop(){if(element.empty()) return false;//如果原始栈栈顶元素与minStack栈顶元素相同,则将该元素也从minStack中pop出去。if(element.top()==minStack.top())minStack.pop();element.pop();return true; }   bool getMin(int &min) { if(minStack.empty()) return false; else { min=minStack.top();//不需要出栈  return true; } }};int main(){    StackGetMin stackMin;    stackMin.push(4);    stackMin.push(6);    stackMin.push(2);    stackMin.push(1);    stackMin.push(5);    int min =0;    //4 6 2 1 5    stackMin.getMin(min);cout<<min<<endl;//1        stackMin.pop();//4 6 2 1    stackMin.pop();//4 6 2 stackMin.getMin(min);cout<<min<<endl;//2    stackMin.pop();//4 6  stackMin.getMin(min);cout<<min<<endl;//4stackMin.push(3);stackMin.push(7);//4 6 3 7 stackMin.getMin(min);cout<<min<<endl;//3    return 0;} 
/*3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,因此输出为该子数组的和 18。贪心 只要正的加上去 sum<0否则加上去 sum=0; 这个较简单只是求和 没有记录位置 */#include<iostream>#include<stdio.h>#include<stack>using namespace std;int maxSubarray(int a[],int size){int i,sum=0;int max=-999999;for(i=0;i<size;i++){sum+=a[i];if(sum<0){sum=0;}else if(max<sum){max=sum;}}return max;}//测试 int main(){int a[]={1,-2, 3, 10, -4, 7, 2, -5};printf("sum=: %d\n",maxSubarray(a,8));     //sum=: 18return 0;} 



0 0
原创粉丝点击