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;
}