0
点赞
收藏
分享

微信扫一扫

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


/*
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;//4

stackMin.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=: 18
return 0;
}




举报

相关推荐

0 条评论