作文以记之 ~ 零矩阵

0、前言

本篇博客依然是一题解,具体题目请 点击此处 进行查看!详细代码以及其他内容可 点击此处 进行查看!
题目不难,而且解法也多,写这篇的目的在于记录作者所使用的两个方法!

1、问题描述

在这里插入图片描述

2、解题思路

2.1 方法1 ~ 利用二维数组记录0的位置

2.1.1 思路

此方法即是遍历目标数组,然后将数组中0的位置记录到指定二维数组中,然后基于此二维数组进行原数组中元素的转化!

2.1.2 程序代码

#include<iostream>
#include<vector>
using namespace std;

void shownums(vector<vector<int>>& nums)
{
	for (int i = 0; i < nums.size(); i++)
	{
		for (int j = 0; j < nums[0].size(); j++)
			cout << nums[i][j] << " ";
		cout << "\n";
	}cout << endl;
}

/* 方法1:先用二维数组记下数组中0的位置,然后依此来调整数组 */
void setzero(vector<vector<int>>& matrix, vector<vector<int>>& ans)
{
	int i, j;
	for (int x = 0; x < ans.size(); x++)
	{
		i = ans[x][0]; j = ans[x][1];
		for (int n = 0; n < matrix.size(); n++)
			matrix[n][j] = 0;
		for (int m = 0; m < matrix[0].size(); m++)
			matrix[i][m] = 0;
	}

}

void setZeroes(vector<vector<int>>& matrix) 
{
	vector<vector<int>> ans;
	for (int i = 0; i < matrix.size(); i++)
	{
		for (int j = 0; j < matrix[0].size(); j++)
		{
			if (matrix[i][j] == 0)
				ans.push_back({ i, j });
		}
	}
	setzero(matrix, ans);
}

void test()
{
	vector<vector<int>> nums = { 
			{ 0,1,2,0 },
			{ 3,4,5,2 },
			{ 1,3,1,5 } };
	cout << "\n原数组:\n"; shownums(nums);
	setZeroes(nums);
	cout << "\n原数组:\n"; shownums(nums);
}
 
int main()
{
	test();
	system("pause");
	return 0;
}

2.1.3 运行结果

在这里插入图片描述

2.2 方法2 ~ 利用循环遍历

2.2.1 思路

此方法的思路主要是 先遍历目标数组的第一行和第一列,若其中有0,则将两个变量设为1,此两个变量用于最后处理第一行和第一列的条件。之后判断其他数组元素的情况,若其他元素为0,则将该元素对应的第一行和第一列的值置为0。最后先根据第一行和第一列的0值去将对应行列的元素置为0,再根据一开始的两个变量对第一行和第一列进行操作!

2.2.2 程序代码

#include<iostream>
#include<vector>
using namespace std;

void shownums(vector<vector<int>>& nums)
{
	for (int i = 0; i < nums.size(); i++)
	{
		for (int j = 0; j < nums[0].size(); j++)
			cout << nums[i][j] << " ";
		cout << "\n";
	}cout << endl;
}

void setZeroes(vector<vector<int>>& matrix) 
{
	
	int row = 0, col = 0;//定义第一行第一列是否有0,有则为1,无则为0
	//先判断第一列是否有0
	for (int i = 0; i < matrix.size(); i++)
	{
		if (matrix[i][0] == 0)
		{
			row = 1;
			break;
		}
	}
	//再判断第一行是否有0
	for (int i = 0; i < matrix[0].size(); i++)
	{
		if (matrix[0][i] == 0)
		{
			col = 1;
			break;
		}
	}
	//再进行其他情况,若在非第一行或第一列有0,则将该位置对应的行列首元素置为0
	for (int i = 1; i < matrix.size(); i++)
	{
		for (int j = 1; j < matrix[0].size(); j++)
		{
			if (matrix[i][j] == 0)
			{
				matrix[i][0] = 0;
				matrix[0][j] = 0;
			}
		}
	}
	//cout << "\n现数组:\n"; shownums(matrix);
	//开始变0
	for (int i = 1; i < matrix.size(); i++)//根据第一列改行
	{
		if (matrix[i][0] == 0)
		{
			for (int j = 1; j < matrix[0].size(); j++)
				matrix[i][j] = 0;
		}
	}
	//cout << "\n现数组:\n"; shownums(matrix);
	for (int i = 1; i < matrix[0].size(); i++)//根据第一行改列
	{
		if (matrix[0][i] == 0)
		{
			for (int j = 1; j < matrix.size(); j++)
				matrix[j][i] = 0;
		}
	}
	//cout << "\n现数组:\n"; shownums(matrix);
	if (row)
	{
		for (int i = 0; i < matrix.size(); i++)
			matrix[i][0] = 0;
	}
	if (col)
	{
		for (int i = 0; i < matrix[0].size(); i++)
			matrix[0][i] = 0;
	}
	//cout << "\n现数组:\n"; shownums(matrix);
}

void test()
{
	vector<vector<int>> nums = { 
			{ 0,1,2,0 },
			{ 3,4,5,2 },
			{ 1,3,1,5 } };
	cout << "\n原数组:\n"; shownums(nums);
	setZeroes(nums);
	cout << "\n处理后数组:\n"; shownums(nums);
}
 
int main()
{
	test();
	system("pause");
	return 0;
}

2.2.3 运行结果

在这里插入图片描述

3、总结

本题不难,只不过还是写了一篇博客纪念一下,上述两种方法有简单易上手的,也有需要多重遍历的,只不过上述代码写的有点冗杂,但暂时不想优化,加油吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值