238 一开始想到是全部乘起来然后除以nums[i] 但如果有0就不适用 且题目说不能用除法
看了题解 思路是乘左边所有数和右边所有数 然后相乘即可 (注意把左右分开就可以O(n)解决问题
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
/* vector<int> L(nums.size(),1);
for (int i=1; i<nums.size(); i++) {
L[i]=L[i-1]*nums[i-1];
}
vector<int> R(nums.size(),1);
for (int i=nums.size()-2; i>=0; i--) {
R[i]=R[i+1]*nums[i+1];
}
vector<int> result(nums.size(),1);
for (int i=0; i<nums.size(); i++) {
result[i]=L[i]*R[i];
}
return result; */
vector<int> result(nums.size(),1);
for (int i=nums.size()-2; i>=0; i--) {
result[i]=result[i+1]*nums[i+1];
}
int left_product=1;
for (int i=0; i<nums.size(); i++) {
result[i]*=left_product;
left_product*=nums[i];
}
return result;
}
};
73 矩阵置零 第一遍遍历记录下要置零的行和列 第二遍遍历置零 空间复杂度O(m+n)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<int> row;
vector<int> col;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
if (matrix[i][j]==0) {
row.push_back(i);
col.push_back(j);
}
}
}
for (int r:row) {
for (int i=0; i<n; i++) {
matrix[r][i]=0;
}
}
for (int c:col) {
for (int i=0; i<m; i++) {
matrix[i][c]=0;
}
}
}
}
记录要置零的行和列不要用额外的空间 第一遍遍历矩阵时发现0位置 标记投射到其对应的第一行和第一列上 第二遍遍历所有位置的时候检查它对应的第一行和第一列是否有0 如果有就置零
q1 第一行和第一列为什么要额外处理?
否则在第二次遍历的时候第一行只要有0就全部被置零 失去标记意义
q2 不管第一行 不重置它行不行?
不行 如果第一行本身有0 不重置第一行也不行
q3 为什么要先记录第一行是否有0 放在第一次遍历后行不行?
不行。因为如果第一行本身是无0的 但标记之后就有0了 重置第一行时会误解
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
bool row1_has_zero = false;
for (int j=0; j<n; j++) {
if (matrix[0][j]==0) {
row1_has_zero=true;
break;
}
}
bool col1_has_zero = false;
for (int i=0; i<m; i++) {
if (matrix[i][0]==0) {
col1_has_zero=true;
break;
}
}
for (int i=1; i<m; i++) {
for (int j=0; j<n; j++) {
if (matrix[i][j]==0) {
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
for (int i=1; i<m; i++) {
for (int j=1; j<n; j++) {
if (matrix[i][0]==0 || matrix[0][j]==0) {
matrix[i][j]=0;
}
}
}
if (row1_has_zero) {
for (int j=0; j<n; j++) {
matrix[0][j]=0;
}
}
if (col1_has_zero) {
for (int i=0; i<m; i++) {
matrix[i][0]=0;
}
}
}
};