leetcode hot100 矩阵

矩阵置0,将矩阵中所有二点出现0位置的行和列置0。

思路:

用一个行数组和列数组记录出现0的行和列,在遍历一遍,将所有出现的行列置0。时间复杂度o(n),空间复杂度o(n)。如何减少时间复杂度呢,可以借助原来的数组的第一行和第一列,来记录,那么第一行和第一列会被改变。因此要先记录第一行和第一列是否有0,用两个标志位表示

核心代码:

    for (int j = 0; j < n; j++) {
        if (matrix[0][j] == 0) {
            flagRow0 = true;
        }
    }
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            if (matrix[i][j] == 0) {
                matrix[i][0] = matrix[0][j] = 0;
            }
        }
    }

旋转矩阵,按照顺时针顺序输出矩阵中的所有元素

思路:

第一种.顺时针,一共四个方向,记录各个方向位置是如何变化,将以访问的数组设置为已访问。规定旋转边界,按规则旋转即可。

第二种 同样按顺时针方向访问到头,这边自动缩放边界

核心代码:

1

int a = new int4;

// 使用数组初始化列表初始化数组的元素

a[0] = new int[]{0, 1};

a[1] = new int[]{1, 0};

a[2] = new int[]{0, -1};

a[3] = new int[]{-1, 0};

if(r<0 || r>= row || c<0 || c>= col ||matrixr == 101){

break;

}

while(r>=0 && r<row && c>=0 && c<col && matrixr != 101){

}

二,

    while(true)
    {
        for(int i = l; i <= r; ++i) ans.push_back(matrix[u][i]); //向右移动直到最右
        if(++ u > d) break; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同
        for(int i = u; i <= d; ++i) ans.push_back(matrix[i][r]); //向下
        if(-- r < l) break; //重新设定有边界
        for(int i = r; i >= l; --i) ans.push_back(matrix[d][i]); //向左
        if(-- d < u) break; //重新设定下边界
        for(int i = d; i >= u; --i) ans.push_back(matrix[i][l]); //向上
        if(++ l > r) break; //重新设定左边界
    }

旋转图像,将图像顺时针旋转90度

思路:发现旋转后的图像,原始图像的第一行为其最后一列,最后一行为其第一列,按照这个规律,新开一个零时数组进行存储即可,但是其时间复杂度会为o(n^2)空间复杂度也会为o(n^2)

这种旋转和平移类似,都可以用翻转(上下翻转,以及主对角线翻转实现),以及找规律实现

核心代码:

    // 水平翻转
    for (int i = 0; i < n / 2; ++i) {
        for (int j = 0; j < n; ++j) {
            swap(matrix[i][j], matrix[n - i - 1][j]);
        }
    }
    // 主对角线翻转
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            swap(matrix[i][j], matrix[j][i]);
        }
    }

因为这边就四个方向所以可以找规律得到

            int temp = matrix[i][j];
            matrix[i][j] = matrix[n - j - 1][i];
            matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
            matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
            matrix[j][n - i - 1] = temp;

搜索矩阵,举证每行的元素从左到右升序排列。每列的元素从上到下升序排列。找到目标值

思路:

这边可发现,第一行最后一个位置,其是这一行最大,这一列最小,因此就可以继续类似折半查找来查询相关元素。

核心代码:

if(matrixr == target){

return true;

}else{

if(matrixr < target){

++c;

}else{

--r;

}

}

}

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值