【leetcode100-018】【矩阵】矩阵置零
2023-12-24 05:42:38
【题干】
给定一个?m x n
?的矩阵,如果一个元素为?0?,则将其所在行和列的所有元素都设为?0?。请使用?原地?算法。
进阶:
- 一个直观的解决方案是使用 ?
O(mn)
?的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用?
O(m?+?n)
?的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
【思路】
- 不太懂为什么这个题可以标mid,除了需要注意不能边扫描边置零导致信息丢失以外,没看出什么能踩的坑,也没看出什么时间复杂度上优化的可能性;
- 既然要尽量压缩辅助空间,那直接一步到位,用第一行第一列做flag记录(其实哪行哪列都行,但不用第一行第一列的话会显得很抽象),由于,如果当前元素是0,那它在第一行第一列的对应位置本身就该被置0,而当前元素不为0时并不会对第一行第一列做什么,所以也不用担心第一行第一列信息丢失的问题;
- 不能忘了还得提前对第一行第一列本身做个单独的处理。
【题解】
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool flag1 = false;//表示第一行是否有0
bool flag2 = false;//表示第一列是否有0
int rows = matrix.size();
int cols = matrix[0].size();
for(int i=0;i<rows;i++){
if(matrix[i][0]==0)
flag2 = true;
}
for(int i=0;i<cols;i++){
if(matrix[0][i]==0)
flag1 = true;
}
for(int i=1;i<rows;i++){//以第一行和第一列为标志位,标志是否这一行/列置0
for(int j=1;j<cols;j++){
if(matrix[i][j]==0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//把标志位所在列置0
for(int i=1;i<cols;i++){
if(matrix[0][i]==0){
for(int j=1;j<rows;j++){
matrix[j][i] = 0;
}
}
}
//把标志位所在行置0
for(int i=1;i<rows;i++){
if(matrix[i][0]==0){
for(int j=1;j<cols;j++)
matrix[i][j] = 0;
}
}
//如果第一行有0存在则将第一行置0
if(flag1==true){
for(int i=0;i<cols;i++)
matrix[0][i] = 0;
}
//如果第一列有0存在则将第一列置0
if(flag2==true){
for(int i=0;i<rows;i++)
matrix[i][0] = 0;
}
return;
}
};
文章来源:https://blog.csdn.net/weixin_63059689/article/details/135169535
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!