问题:给定一个二维的mxn矩阵,如果某个元素为0,那么将其所在的行和列的所有元素设为0.不允许使用额外空间。
OC算法实现:
//
// SetMatrixZero.h
// Algorithm
//
// Created by han shuai on 2016/9/28.
// Copyright © 2016年 han shuai. All rights reserved.
//
/**
24
*/
#import <Foundation/Foundation.h>
@interface SetMatrixZero : NSObject
- (NSMutableArray *)setMatrixZero:(NSMutableArray *)matrix;
@end
//
// SetMatrixZero.m
// Algorithm
//
// Created by han shuai on 2016/9/28.
// Copyright © 2016年 han shuai. All rights reserved.
//
#import "SetMatrixZero.h"
@implementation SetMatrixZero
- (NSMutableArray *)setMatrixZero:(NSMutableArray *)matrix
{
NSInteger m = matrix.count;//行
if (m == 0) {
return matrix;
}
NSInteger n = [matrix[0] count];//列
//记录第一个为0的值得行列
NSInteger x = -1;//行
NSInteger y = -1;//列
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if ([[matrix[i] objectAtIndex:j] intValue] == 0) {
if (x == -1 && y == -1) {
x = i;
y = j;
}
else
{
//使用第一个0元素的行 记录需要清零的列
//使用第一个0元素的列 记录需要清零的行
[matrix[x] replaceObjectAtIndex:j withObject:[NSNumber numberWithInt:0]];
[matrix[i] replaceObjectAtIndex:y withObject:[NSNumber numberWithInt:0]];
}
}
}
}
/**
清空除第一个0值的行列
*/
//清空列
for (int i = 0; i < n; i++) {
if (i != y && [[matrix[x] objectAtIndex:i] intValue] == 0) {
for (int j = 0; j < m; j++) {
[matrix[j] replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:0]];
}
}
}
//清空行
for (int i = 0; i < m; i++) {
if (i !=x && [[matrix[i] objectAtIndex:y] intValue] == 0) {
for (int j = 0; j < n; j++) {
[matrix[i] replaceObjectAtIndex:j withObject:[NSNumber numberWithInt:0]];
}
}
}
/**
清空第一个0值的行列
*/
//列
for (int i = 0; i < n; i++) {
[matrix[x] replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:0]];
}
//行
for (int i = 0; i < m; i++) {
[matrix[i] replaceObjectAtIndex:y withObject:[NSNumber numberWithInt:0]];
}
return matrix;
}
@end