学习笔记--栈1106

155. 最小栈

在这里插入图片描述

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> x_stack;
    stack<int> min_stack;
    MinStack() {
        min_stack.push(INT_MAX);        
    }
    
    void push(int x) {
        x_stack.push(x);
        min_stack.push(min(min_stack.top(),x));        
    }
    
    void pop() {
        x_stack.pop();
        min_stack.pop();        
    }
    
    int top() {
       return x_stack.top();        
    }
    
    int getMin() {
        return min_stack.top();
    }
};

point:
1.辅助栈min_stack
在这里插入图片描述2.INT_MAX = 2^31 - 1 =2147483647
INT_MIN= - 2^31 = -2147483648
进行初始化使其大于所有数

283. 移动零

在这里插入图片描述


```cpp
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n=nums.size();
        int count=0;
        for(int i=0;i<n;i++)
        {
            if(nums[i]==0)count++;
        }
        vector<int>ans;
        for(int i=0;i<n;i++)
        {
            if(nums[i]!=0)
            {
                ans.push_back(nums[i]);                
            }            
        }
        while(count>0)
            {
                ans.push_back(0);
                count--;
            }
        for(int i=0;i<n;i++)
        {
            nums[i]=ans[i];
        }
    }
};

1480. 一维数组的动态和 1111

在这里插入图片描述

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        int n=nums.size();
        vector<int> ans(n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=i;j++)
            {
                ans[i]+=nums[j];
            }            
        }
        return ans;

    }
};

better:

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        int n=nums.size();
        for(int i=1;i<n;i++)
        {
            nums[i]+=nums[i-1];            
        }
        return nums;
    }
};

724. 寻找数组的中心索引

在这里插入图片描述

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n=nums.size();
        int sum=0,leftsum=0;
        for(int i=0;i<n;i++)
        {
            sum+=nums[i];
        }
        for(int i=0;i<n;i++)
        {
            if(sum-nums[i]==leftsum*2)return i;
            leftsum+=nums[i];
        }
        return -1;

    }
};

point:用两个循环会超时

35. 搜索插入位置

在这里插入图片描述

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n=nums.size();
        if(target<nums[0])return 0;
        if(target>nums[n-1])return n;
        for(int i=0;i<n-1;i++)
        {
            if(target>nums[i]&&target<=nums[i+1])return i+1;                            
        }
        return 0;
    }
};

二分查找----里面的题目可是我暂时还不会
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        for(int i=0;i<n;i++)
        {
            if(target==nums[i])return i;
        }
        return -1;
    }
};

在这里插入图片描述

class Solution {
public:
    int mySqrt(int x) {
        for(long long i=0;i<=x;i++)
        {
            if(i*i<=x&&(i+1)*(i+1)>x)return i;
        }
        return 0;
    }
};

就是不用二分查找哈哈哈(为防止溢出使用longlong
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

class Solution {
public:
    int mySqrt(int x) {
        if(x<=1)return x;
        int left=0,right=x,ans=-1;
        while(left<=right)
        {
            int mid=left+(right-left)/2;
            if((long long)mid*mid<=x)
            {
                ans=mid;
                left=mid+1;
            }
            else
            {
                right=mid-1;
            }
        }
        return ans;
    }
};

耶我会了一丢丢二分查找了。

374. 猜数字大小

在这里插入图片描述

/** 
 * Forward declaration of guess API.
 * @param  num   your guess
 * @return 	     -1 if num is lower than the guess number
 *			      1 if num is higher than the guess number
 *               otherwise return 0
 * int guess(int num);
 */

class Solution {
public:
    int guessNumber(int n) {
        int left=1,right=n,ans=-1;        
        while(left<=right)
        {
            int mid=left+(right-left)/2;
            if(guess(mid)==0)return mid;
            else if(guess(mid)==-1){right=mid-1;}
            else{left=mid+1;}
        }
        return ans;
    }
};

关于要不要在循环内return的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值