包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
class Solution {
public:
stack<int> s1,s2;
void push(int value){
s1.push(value);//s1记录所有的数字
if(s2.empty()) s2.push(value);//如果s2是空的,先push进去
else if(value<=s2.top()) s2.push(value);
//如果这个value小于等于s2的栈首,push进去,s2一定是递减的,s2的栈首一定是最小的
}
void pop(){
if(s1.top()==s2.top()) s2.pop();//如果两个栈首相等,s2出栈,表明出栈的这个是最小的
s1.pop();//s1始终要出栈
}
int top(){
return s1.top();
}
int min(){
return s2.top();
}//s2维护的是min,
};
69. x 的平方根
难度简单363收藏分享切换为英文关注反馈
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4 输出: 2
示例 2:
输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
class Solution {
public:
/*1.从1枚举,注意 long long int tmp=(long long int)(i+1)*(long long int)(i+1);
执行用时 :52 ms, 在所有 C++ 提交中击败了5.06%的用户
内存消耗 :5.9 MB, 在所有 C++ 提交中击败了100.00%的用户*/
int mySqrt1(int x) {
int res=0;
for(int i=1;i<=x;i++){
if(i*i==x){
res=i; break;
}
else if(i*i<x){
long long int tmp=(long long int)(i+1)*(long long int)(i+1);
if(tmp>(long long int)x){
res=i; break;
}
}
}
return res;
}
/*2.袖珍计算器算法,使用指数函数exp和对数函数ln代替平方根函数的方法,根号x=x^1/2=(e^lnx)^1/2=e^(1/2*lnx)
执行用时 :4 ms, 在所有 C++ 提交中击败了70.20%的用户
内存消耗 :6.3 MB, 在所有 C++ 提交中击败了100.00%的用户*/
int mySqrt2(int x){
if(x==0) return 0;
int res=exp(0.5*log(x));
if((long long) (res+1)*(res+1) <=x) return res+1;
return res;
}
/*3.二分查找,
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :5.8 MB, 在所有 C++ 提交中击败了100.00%的用户
*/
int mySqrt3(int x){
int l=0,r=x,res=-1;
while(l<=r){
int mid=l+(r-l)/2;
if((long long)mid*mid<=x){
res=mid;
l=mid+1;
}else r=mid-1;
}
return res;
}
/*4.牛顿迭代,快速求解函数零点
https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/*/
};