面试算法题

1、直方图矩形最大值

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int res = 0;
        stack<int> s;
        heights.push_back(0);
        for (int i = 0; i < heights.size(); ++i) {
            while (!s.empty() && heights[s.top()] >= heights[i]) {
                int cur = s.top(); s.pop();
                res = max(res, heights[cur] * (s.empty() ? i : (i - s.top() - 1)));
            }
            s.push(i);
        }
        return res;
    }
};

2、第n个丑数

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> res(1, 1);
        int i2 = 0, i3 = 0, i5 = 0;
        while (res.size() < n) {
            int m2 = res[i2] * 2, m3 = res[i3] * 3, m5 = res[i5] * 5;
            int mn = min(m2, min(m3, m5));
            if (mn == m2) ++i2;
            if (mn == m3) ++i3;
            if (mn == m5) ++i5;
            res.push_back(mn);
        }
        return res.back();
    }
};

3、LRU Cache 最近最少使用页面置换缓存器

class LRUCache{
public:
    LRUCache(int capacity) {
        cap = capacity;
    }
    
    int get(int key) {//在m中查找给定的key,如果存在则将此项移到顶部,并返回value,若不存在返回-1
        auto it = m.find(key);
        if (it == m.end()) return -1;
        l.splice(l.begin(), l, it->second);
        return it->second->second;
    }
    
    void set(int key, int value) {
        auto it = m.find(key);
        if (it != m.end()) l.erase(it->second);//如果存在就删掉原有项
        l.push_front(make_pair(key, value));//插入头部
        m[key] = l.begin();
        if (m.size() > cap) {//若溢出则删掉底部项(最不常用项)
            int k = l.rbegin()->first;
            l.pop_back();
            m.erase(k);
        }
    }
    
private:
    int cap;
    list<pair<int, int> > l;
    unordered_map<int, list<pair<int, int> >::iterator> m;//存储在list中的位置
};

4、非递归翻转二叉树

5、筛选法求素数

void init()  
{  
    memset(vis,0,sizeof(vis));  
    int m=sqrt(maxn+0.5);  
    for(int i=2;i<=m;i++){  
        for(int j=i*i;j<=maxn;j+=i){  
            vis[j]=true;  
        }  
    }  
    ind=0;  
    for(int i=2;i<=maxn;i++){  
        if(!vis[i])prime[ind++]=i;  
    }  
}  

6、加油站问题

7、最大子矩阵和

#include"stdio.h"  
#include"math.h"  
#include"string.h"  
#define N 105  
int Maxsum(int a[],int m)  
{                         //求一维数组的最大字段和  
    int i,s=0,max=a[0];  
    for(i=0;i<m;i++)  
    {  
        if(s>=0)  
            s+=a[i];  
        else  
            s=a[i];  
        if(s>max)  
            max=s;  
    }  
    return max;  
}  
int main()  
{  
    int n,i,j,k;  
    int b[N];  
    int a[N][N];  
    while(scanf("%d",&n)!=-1)  
    {  
        for(i=0;i<n;i++)  
            for(j=0;j<n;j++)  
                scanf("%d",&a[i][j]);  
        int max=a[0][0];  
        for(i=0;i<n;i++)      
        {  
            memset(b,0,sizeof(b));  
            for(j=i;j<n;j++)        //从某一行开始加到末行  
            {  
                for(k=0;k<n;k++)         //求解相加过程中的最大字段和  
                    b[k]+=a[j][k];  
                int t=Maxsum(b,n);  
                if(t>max)  
                    max=t;  
            }  
        }  
        printf("%d\n",max);  
    }  
    return 0;  
}

    原文作者:pmt123456
    原文地址: https://blog.csdn.net/pmt123456/article/details/77842848
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞