题目一:
求解锁屏方案数;9的阶乘不过是3.6w,这个数量级搞暴力是绰绰有余的,何况还说了不让跳着连,别说了,说就是暴力。上代码
class Solution {
public:
/**
* 实现方案
* @param m int整型 最少m个键
* @param n int整型 最多n个键
* @return int整型
*/
int getans(int x,int map[][4],int pi,int pj)
{
if(x==0)return 1;
int ans=0;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
if(map[i][j])continue;
if(abs(i-pi)==1||abs(j-pj)==1||map[(i+pi)/2][(j+pj)/2])
{
map[i][j]=1;
ans+=getans(x-1,map,i,j);
map[i][j]=0;
}
}
}
return ans;
}
int solution(int m, int n) {
if(n==0||n<m)return 0;
int map[4][4]={0},ans=0;
for(int k=max(m,1);k<=n;k++)
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
map[i][j]=1;
ans+=getans(k-1,map,i,j);
map[i][j]=0;
}
}
}
return ans;
}
};
题目二:
二维vector的查找,直接二分找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty())return false;
for(int i=0;i<array.size();i++)
{
if(array[i].size()==0)continue;
int l=0,r=array[i].size()-1;
while(abs(r-l)>1)
{
int mid=(l+r)>>1;
if(array[i][mid]>=target)r=mid;
else l=mid;
}
if(array[i][r]==target||array[i][l]==target)return true;
}
return false;
}
};
题目三:
数学题,找关系式,又是二分水题
class Solution {
public:
/**
*
* @param n int整型 第n天
* @return int整型
*/
int f[20000];
void init()
{
f[1]=1;
for(int i=2;i<20000;i++)
f[i]=i*(i+1)/2;
}
int solution(int n) {
init();
int l=1,r=20000-1;
while(abs(r-l)>1)
{
int mid=(l+r)>>1;
if(f[mid]>n)r=mid;
else l=mid;
}
int ans=r*(r-1)*(2*r-1)/6+r*(n-r*(r-1)/2);
return ans;
}
};
别问我为什么要水一篇,,,,
纯粹是马上要到3级了想苟个博客皮肤。