73. Set Matrix Zeroes

本文介绍了一种不使用额外空间将矩阵中值为0的元素所在行和列置零的算法。通过巧妙利用矩阵的第一行和第一列作为标记,并借助两个布尔变量记录第一行和第一列的状态,最终实现了原地修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题:

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.

Follow up:

Did you use extra space?
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的行和列标记好,最后处理。不能在中间处理,因为中间改动会不清楚哪些元素一开始值是0。


解题思路:

遍历数组,遇到值为0的元素,就把它所在行第一个元素和所在列第一个元素变为0,最后遍历第一行和第一列,改变数组。这样会出现一个问题:无法判断第一行和第一列要不要变成0。因此在遍历数组(准确说是不包括第一行和第一列的数组)之前先用两个boolean变量记录第一行和第一列是否出现过0.最后处理第一行和第一列。


AC代码:

int[][] matrix;
    String word1,word2;
    public int minDistance(String word1, String word2) {
        this.word1 = word1;
        this.word2 = word2;
        int len1 = word1.length(),len2 = word2.length();
        matrix = new int[len1+1][len2+1];
        if (len1 == 0) return len2;
        if (len2 == 0) return len1;
        //下面初始化时步数多加了1,是为了以后根据矩阵元素是否为0就可以判断此元素是否计算过。最后返回结果时记得减一就可以了
        matrix[0][0] = 1;
        /*if (len1 == 1) return matrix[0][0] + len2 - len1;//控制某个字符串只有一个字符的情况,防止下面越界
        if (len2 == 1) return matrix[0][0] + len1 - len2;
        matrix[0][1] = matrix[0][0] + 1;
        matrix[1][0] = matrix[0][0] + 1;*/
        return findEditDistance(len1,len2) - 1;
    }

    /*
    寻找word1前i+1个字符合word2前j+1个字符匹配最小步数
     */
    public int findEditDistance(int i,int j){
        if (matrix[i][j] != 0) return matrix[i][j];
        int r1 = Integer.MAX_VALUE,r2 = Integer.MAX_VALUE,r3 = Integer.MAX_VALUE;
        boolean b1 = i > 0,b2 = j > 0,b3 = b1 && b2;
        if (b1) r1 = findEditDistance(i - 1,j) + 1;
        if (b2) r2 = findEditDistance(i,j - 1) + 1;
        if (b3) r3 = findEditDistance(i-1,j-1) + (word1.charAt(i-1) == word2.charAt(j-1)? 0:1);
        matrix[i][j] = Math.min(r1,Math.min(r2,r3));
        return matrix[i][j];
    }

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ["SimHei"] # 单使用会使负号显示错误 plt.rcParams['axes.unicode_minus'] = False # 把负号正常显示 # 读取北京房价数据 path = 'data.txt' data = pd.read_csv(path, header=None, names=['房子面积', '房子价格']) print(data.head(10)) print(data.describe()) # 绘制散点图 data.plot(kind='scatter', x='房子面积', y='房子价格') plt.show() def computeCost(X, y, theta): inner = np.power(((X * theta.T) - y), 2) return np.sum(inner) / (2 * len(X)) data.insert(0, 'Ones', 1) cols = data.shape[1] X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列 y = data.iloc[:,cols-1:cols]#X是所有行,最后一列 print(X.head()) print(y.head()) X = np.matrix(X.values) y = np.matrix(y.values) theta = np.matrix(np.array([0,0])) print(theta) print(X.shape, theta.shape, y.shape) def gradientDescent(X, y, theta, alpha, iters): temp = np.matrix(np.zeros(theta.shape)) parameters = int(theta.ravel().shape[1]) cost = np.zeros(iters) for i in range(iters): error = (X * theta.T) - y for j in range(parameters): term = np.multiply(error, X[:, j]) temp[0, j] = theta[0, j] - ((alpha / len(X)) * np.sum(term)) theta = temp cost[i] = computeCost(X, y, theta) return theta, cost alpha = 0.01 iters = 1000 g, cost = gradientDescent(X, y, theta, alpha, iters) print(g) print(computeCost(X, y, g)) x = np.linspace(data.Population.min(), data.Population.max(), 100) f = g[0, 0] + (g[0, 1] * x) fig, ax = plt.subplots(figsize=(12,8)) ax.plot(x, f, 'r', label='Prediction') ax.scatter(data.Population, data.Profit, label='Traning Data') ax.legend(loc=2) ax.set_xlabel('房子面积') ax.set_ylabel('房子价格') ax.set_title('北京房价拟合曲线图') plt.show()
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值