【CODE】包含min函数的栈 & x 的平方根

包含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 的平方根,其中 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 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/*/
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值