您的位置:首页 > 其它

leecode 解题总结:73. Set Matrix Zeroes

2017-02-11 23:58 302 查看
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
/*
问题:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

分析:这是程序员面试金典的一道题目。元素为0,需要将该元素所在行和列都置为0。

输入:
3(行数) 4(列数)
1 1 0 1
1 0 1 1
1 1 1 1
输出:
0 0 0 0
0 0 0 0
1 0 0 1

关键:
1 注意如果如果将所在行和列设置为0,后,再遍历矩阵,会把整个矩阵变成0.
为了避免这种情况,当遍历到某个元素为0时,先记录这个元素的行号和列号,最后再调整
需要清零的行号存入行号数组rowArr,需要清零的列号存入列号数组colArr。
下一次再遍历某个元素是A[i][j],如果rowArr[i] == 1 或者colArr[j] == 1,就设置为0
*/

class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.empty())
{
return ;
}
int row = matrix.size();
int col = matrix.at(0).size();
vector<int> rowArr(row ,  0);//初始化0表示非删除标记
vector<int> colArr(col , 0);
for(int i = 0 ; i < row ; i++)
{
for(int j = 0 ; j < col ;j++)
{
//遇到0元素,记录0元素的行号和列号
if(matrix.at(i).at(j) == 0)
{
rowArr.at(i) = 1;
colArr.at(j) = 1;
}
}
}
for(int i = 0 ; i < row ; i++)
{
for(int j = 0 ; j < col ;j++)
{
//如果当前元素的行号或者列号是对应0元素的标记,就设置
if( 1 == rowArr.at(i) || 1 == colArr.at(j))
{
matrix.at(i).at(j) = 0;
}
}
}
}
};

void print(vector<vector<int>>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
int len = result.at(0).size();
for(int i = 0 ; i < size ; i++)
{
for(int j = 0 ; j < len ; j++)
{
cout << result.at(i).at(j) << " " ;
}
cout << endl;
}
}

void process()
{
int row;
int col;
Solution solution;
vector<vector<int>> matrix;
int value;
while(cin >> row >> col )
{
matrix.clear();
for(int i = 0 ; i < row ; i++)
{
vector<int> nums;
for(int j = 0 ; j < col ; j++)
{
cin >> value;
nums.push_back(value);
}
matrix.push_back(nums);
}
solution.setZeroes(matrix);
print(matrix);
}
}

int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: