您的位置:首页 > 其它

LintCode 433: Number of Islands

2017-02-07 11:00 211 查看
直接用了序贯算法写。然后发现!太麻烦了啊啊啊啊啊啊一道easy题写的心好累

(虽然时间复杂度挺好的。

class Solution {
public:
/**
* @param grid a boolean 2D matrix
* @return an integer
*/
int checkEqualList(vector< vector<int> >& equalList,int sign1,int sign2){
int signMin=min(sign1,sign2);
int signMax=max(sign1,sign2);
int i;
for(i=0;i<equalList[signMin].size();i++)
if(equalList[signMin][i]==signMax)
return signMin;

equalList[signMin].push_back(signMax);
return signMin;
}

int numIslands(vector< vector<bool> >& grid) {
int num=0;
int columnSize;
int rowSize;
int i,j;

if(grid.size()){
columnSize=grid[0].size();
rowSize=grid.size();
}

else{
columnSize=rowSize=0;
return 0;
}

vector< vector<int> > sign(rowSize,vector<int>(columnSize));
vector< vector<int> > equalList;

for(i=0;i<rowSize;i++){
for(j=0;j<columnSize;j++){
if(!grid[i][j])
continue;

//if the up and left points all have value of one, add their signs to equal list
if(j-1>=0&&grid[i][j-1]==1&&i-1>=0&&grid[i-1][j]==1&&sign[i-1][j]!=sign[i][j-1]){
//add the large sign to the small sign's vector column.
sign[i][j]=checkEqualList(equalList,sign[i-1][j],sign[i][j-1]);
}

else if(((j-1>=0&&grid[i][j-1]==0)||j==0)
&&((i-1>=0&&grid[i-1][j]==0)||i==0)){
//if the up and left points don't exist or have value of one,add a new sign to equal list.
equalList.push_back(vector<int>());
sign[i][j]=num;
num++;
}

else{
if(j-1>=0&&grid[i][j-1]==1)
sign[i][j]=sign[i][j-1];
else if(i-1>=0&&grid[i-1][j]==1)
sign[i][j]=sign[i-1][j];
}

}
// cout<<"num:"<<num<<endl;
}
int minusNum=0;
int equalSize=equalList.size();
for(i=0;i<equalSize;i++){
// for(j=0;j<equalList[i].size();j++){
// cout<<equalList[i][j]<<" ";
// }
// cout<<" i:"<<i<<endl;
minusNum+=equalList[i].size();
}
// for(i=0;i<rowSize;i++){
// for(j=0;j<columnSize;j++){
// cout<<sign[i][j]<<" ";
//// if(grid[i][j]&&!sign[i][j])
//// cout<<i<<" "<<j<<" ";
// }
//
// cout<<endl;
// }

return num-minusNum;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: