最长递增子序列长度
背景题,大意就是产品经理寻求技术人员帮助,从一长串数据中,找出最长的递增子序列(不一定连续,但是顺序不能乱)的长度。
动态规划法:
长度为n的数组{a0,a1,…,an-1},假设以aj结尾的数组序列是最长递增子序列,长度为L(j),则L(j) = { max(L(i))+1,i<j且a[i]<a[j] }。即在计算到达j位置时的最长递增序列长度时,要对j之前的所有位置 i (0到j-1) 进行遍历,找到a[i]<a[j]的L(i),并取max(L(i))+1作为L(j)的值。
int maxIncreaseListLen(vector<int> arr){
int len=arr.size();
if(len<=1) return 0;
int *list=new int[len];
for(int i=0;i<len;i++) //初始化,每个元素单独成为一个子序列,长度为1
list[i]=1;
for(int j=1; j<len; j++) //从1位置开始,对每个元素进行检验
for(int i=0; i<j; i++)
if(arr[j]>a[i] && list[j]<list[i]+1) //两个条件,缺一不可
list[j]=list[i]+1;
int max=0;
for(int i=0;i<len;i++)
max=max>list[i]? max:list[i];
return max;
}
货架内有多少个物品堆
背景题,大意是给你二维数组,判断数组内由1组成的“堆”(上下左右相连)的个数
题目并不难,关键是要注意给定的数据格式vector<vector< char >>
暴力遍历法:
对整个矩阵进行遍历检查,当检查到为‘1’时,将能与其相连位置上的‘1’全部置零即可。
*注意到如下图的<右上角>和<左侧边>突出‘1’的情况。
0 0 1 0 1 0
0 1 1 1 1 1
0 0 1 0 0 1
1 0 0 0 1 0
void check(vector<vector<char>> &prid, int m,int n, int i, int j){
prid[i][j]='0';
if(p[i+1][j]=='1' && i+1<m) check(prid, m,n, i+1,j);
if(p[i][j+1]=='1' && j+1<n) check(prid, m,n, i,j+1);
if(p[i-1][j]=='1' && i-1>0) check(prid, m,n, i-1,j);
if(p[i][j-1]=='1' && j-1>0) check(prid, m,n, i,j-1);
}
int maxNum(vector<vector<char>> &prid){
int m=prid.size();
if(m==0) return 0;
int n=prid[0].size();
int rob=0;
for(int i=0;i<m;i++)
for(int j=0;i<n;j++)
if(prid[i][j]=='1'){ //此处一定要注意是==‘1’,不是==1.不然调试死活找不着
rob++;
check(prid, m,n, i,j);
}
return rob;
}