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;
}
};
(虽然时间复杂度挺好的。
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;
}
};
相关文章推荐
- lintcode:Number of Airplanes in the Sky
- lintcode-677. Number of Big Islands
- LintCode "Number of Islands II"
- LintCode "Sort Colors II"
- lintcode-medium-Partition Array
- LintCode--最小子数组
- LintCode Python 合并排序数组
- LintCode 1.A+B问题
- [Leetcode-200]Number of Islands 陆地的数量
- lintcode(480)——二叉树的所有路径
- LintCode-翻转一个链表
- LintCode -- k数和
- LintCode —— 2. 尾部的零
- Lintcode - 数据流中位数
- lintcode:买卖股票的最佳时机 II
- LintCode "Max Tree"
- lintcode 173 单链表插入排序 python
- lintcode-逆波兰表达式求值-424
- lintcode——二叉树的层次遍历
- lintcode 容易题:Binary Tree Inorder Traversal 二叉树的中序遍历