给定整数矩阵arr以及整数k,确定是否arr中值为k的所有单元是否都连接在一起。 如果矩阵中的两个单元在水平或垂直方向上相邻且具有相同的值,则视为连接。
输入:arr=[
[2,2,2,0],
[0,0,0,2],
[0,1,0,2],
[1,1,1,2]]
k=2
输出:false
解释:不是所有的2
都相互连接
算法分析:这个题目我一开始的思路很直接,找到第一个k值,把他改为k+1,然后遍历他与他相连的所有k值,将其改为k+1。再遍历一遍数组,如果数组中还有k值的话,那就证明原数组中的k不是连通的,反之就是连通的。
当然还有另一种思路,使用bfs找出一块k值之后记录数量为1,继续查找数组剩下的元素,如果又查到一块的话则返回false。
这两种思路超过的提交数都蛮低的,但这是我能想到的最优的方法了,如果有更快的方法,希望可以指点一下。
class Solution {
public:
/**
* @param arr: the arr
* @param k: the k
* @return: if all instances of value k in arr are connected
*/
//上下左右
int v[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
void BPS(vector<vector<int>> &arr,int i,int j,int k,int m,int n)
{
if(i>=0&&i<m&&j>=0&&j<n&&arr[i][j]==k)
{
//改值
arr[i][j]=k+1;
//遍历上下左右
for(int x=0;x<4;x++)
{
BPS(arr,i+v[x][0],j+v[x][1],k,m,n);
}
}
}
bool judgeConnection(vector<vector<int>> &arr, int k) {
// Write your code here.
int m=arr.size();
int n=arr[0].size();
int firsti,firstj;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(arr[i][j]==k)
{
//一旦找到第一个k出现的地址,立即停止循环
firsti=i,firstj=j;
i=m,j=n;
}
}
}
BPS(arr,firsti,firstj,k,m,n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(arr[i][j]==k)
{
//还有k值则证明不连通
return false;
}
}
}
return true;
}
};