73. Set Matrix Zeroes

问题描述

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.

Example 1:

I**nput:**
[
[1,1,1],
[1,0,1],
[1,1,1]
]
Output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
Example 2:

Input:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
Output:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]

Follow up:

  • A straight forward solution using O(mn) space is probably a bad idea.
  • A simple improvement uses O(m + n) space, but still not the best solution.
  • Could you devise a constant space solution?
    题目链接:

思路分析

给一个二维数组,如果有0出现,就把0所在的行和列的元素全部都置为0。最好用 O(1) 的空间复杂度。

利用二维数组的第一行和第一列作为行和列是否置0的标志位,也就是遍历的时候放掉第0列。然后再次循环数组,这次是逆序的,从后向前遍历,继续放掉第0列,如果元素有标志要置0就改变,第一列是否置零根据firstCol标志位进行操作。

从后向前的操作可以省去一个将第一列全部置0的过程。

代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        bool firstCol = false;
        for (int i = 0; i < m; i++){
            if (matrix[i][0] == 0)
                firstCol = true;
            for (int j = 1; j < n; j++){
                if (matrix[i][j] == 0)
                    matrix[i][0] = matrix[0][j] = 0;
            }
        }
        for (int i = m - 1; i >= 0; i--){
            for (int j = n - 1; j >= 1; j--){
                if (matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;
            }
            if (firstCol)
                matrix[i][0] = 0;
        }
    }
};

时间复杂度: O(mn)
空间复杂度: O(1)


反思

in-place的方式处理这个矩阵,因为循环方向的问题,所以要选中第一列,作为比较特殊的存在。

function startupFcn(app) app. upButton. Enable=' Off'; app. downButton. Enable=' Off'; app. leftButton. Enable=' Off'; app. rightButton. IEnable='Of'; app. GameoverButton.Text='Waiting'; end properties (Access = public) matrix= zeros(4,4); % Description matrix1= zeros(4,4); Rank_number = zeros(1,10); Rank_text= string(zeros(1,10)); app. GameoverButton. Text=" Playing"; sum_Score= sum(app. matrix,' all'); app. ScoreEditField. Value= sum_Score; app. StartButton. Enable='0ff'; app. RankresetButton.Enable='0ff'; app. upButton. Enable='0n'; app. downButton. Enable=' On'; app. leftButton. Enable=' On'; app. rightButton.Enable='on'; for i=1:10 %更新存储数组中的值 if app. ScoreEditField. Value> app. Rank_number(i) for j=10:-1:i+1 app. Rank_number(j)= app. Rank_number(j-1); app. Rank_text(j)= app. Rank_text(j-1); end app. Rank_number(i)= app. ScoreEditField. Value; app. Rank_text(i)= app. PlayernameEditField. Value; break; end end for i=2:4 for j=1:4 if app. matrix(i-1,j)==0 temp= app. matrix(i-1,j); app. matrix(i-1,j)= app. matrix(i,j); app. matrix(i,j)= temp; end end end for i=2:4 for j=1:4 if(app. matrix(i-1,j)== app. matrix(i,j))&& app. matrix(i-1,j)~=0 app. matrix(i-1,j)= app. matrix(i-1,j)*2; app. matrix(i,j)=0; for k=i:3 app. matrix(k,j)= app. matrix(k+1,j); app. matrix(k+1,j)=0; end end end end zeros_matrix= fi_d(app. matrix==0); if length(zeros_matrix)>=1 z= randi([1, length(zeros_matrix)]); z1=2* randi([1,2]); app. matrix(zeros_matrix(z))=z1; end function []= update(app) % colorlist=[ 0.8039 0.7569 0.7059 0.9333 0.8941 0.8549 0.9373 0.8784 0.8039 0.9608 0.6863 0.4824 0.9529 0.5922 0.4078 0.9529 0.4902 0.3725 0.9686 0.3686 0.2431 0.9255 0.8118 0.4510 0.9373 0.7882 0.3922 0.9333 0.7804 0.3216 0.9216 0.7686 0.2627 0.9255 0.7608 0.1804]; % %对矩阵的赋值 app. EditField. Value= app. matrix(1,1); app. EditField_2. Value= app. matrix(1,2); app. EditField_3. Value= app. matrix(1,3); app. EditField_4. Value= app. matrix(1,4); app. EditField_5. Value= app. matrix(2,1); app. EditField_6. Value= app. matrix(2,2); app. EditField_7. Value= app. matrix(2,3); app. EditField_8. Value= app. matrix(2,4); app. EditField_9. Value= app. matrix(3,1); app. EditField_10. Value= app. matrix(3,2); app. EditField_11. Value= app. matrix(3,3); app. EditField_12. Value= app. matrix(3,4); app. EditField_13. Value= app. matrix(4,1); app. EditField_14. Value= app. matrix(4,2); app. EditField_15. Value= app. matrix(4,3); app. EditField_16. Value= app. matrix(4,4); %改变颜色 temp_num= log(app. matrix)./ log(2); temp_num(temp_num<0)=0; app. EditField. BackgroundColor= colorlist(temp_num(1,1)+1,:); app. EditField_2. BackgroundColor= colorlist(temp_num(1,2)+1,:); app. EditField_3. BackgroundColor= colorlist(temp_num(1,3)+1,:); app. EditField_4. BackgroundColor= colorlist(temp_num(1,4)+1,:); app. EditField_5. BackgroundColor= colorlist(temp_num(2,1)+1,:); app. EditField_6. BackgroundColor= colorlist(temp_num(2,2)+1,:); app. EditField_7. BackgroundColor= colorlist(temp_num(2,3)+1,:); app. EditField_8. BackgroundColor= colorlist(temp_num(2,4)+1,:); app. EditField_9. BackgroundColor= colorlist(temp_num(3,1)+1,:); app. EditField_10. BackgroundColor= colorlist(temp_num(3,2)+1,:); app. EditField_11. BackgroundColor= colorlist(temp_num(3,3)+1,:); app. EditField_12. BackgroundColor= colorlist(temp_num(3,4)+1,:); app. EditField_13. BackgroundColor= colorlist(temp_num(4,1)+1,:); app. EditField_14. BackgroundColor= colorlist(temp_num(4,2)+1,:); app. EditField_15. BackgroundColor= colorlist(temp_num(4,3)+1,:); app. EditField_16. BackgroundColor= colorlist(temp_num(4,4)+1,:); end
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值