1. 程式人生 > >01 Matrix 01 矩陣

01 Matrix 01 矩陣

給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。

兩個相鄰元素間的距離為 1 。

示例 1: 
輸入:

0 0 0
0 1 0
0 0 0

輸出:

0 0 0
0 1 0
0 0 0

示例 2: 
輸入:

0 0 0
0 1 0
1 1 1

輸出:

0 0 0
0 1 0
1 2 1

注意:

  1. 給定矩陣的元素個數不超過 10000。
  2. 給定矩陣中至少有一個元素是 0。
  3. 矩陣中的元素只在四個方向上相鄰: 上、下、左、右。

思路:採用BFS,但是這道題和傳統的BFS不太一樣,傳統的BFS都會以queue為輔助,每次取q.size()作為外迴圈的次數,因為q的佇列裡儲存的都是性質相同的元素。但是這道題不太一樣,首先把matrix中為0的元素的下標加到q中,且初始化元素為0的元素為0,其他元素為INT_MAX。然後每次取出q的一個元素,考察它的四個方向(上下左右)的值和(當前下標的值+1)的值誰大,如果對應方向的值更大,就更新為當前下標的值+1(相當於那個方向有可能會成為一個新的拓展節點),並把對應的方向放入新的佇列中。

參考程式碼:

class Solution {
public:
void updateMatrixCore(vector<vector<int>>& matrix, queue<pair<int, int>> &q, vector<vector<int>> &res) {
	int direction[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };
	while (!q.empty()) {
		pair<int, int> pair = q.front(); q.pop();
		for (int i = 0; i < 4; i++) {
			int new_r = pair.first + direction[i][0], new_c = pair.second + direction[i][1];		
			if (new_r >= 0 && new_r < matrix.size() && new_c >= 0 && new_c < matrix[0].size()) {
				if (res[new_r][new_c] > (res[pair.first][pair.second] + 1)) {
					res[new_r][new_c] = res[pair.first][pair.second] + 1;
					q.push(make_pair(new_r,new_c));
				}
			}
		}
	}
}
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
	if (matrix.empty()) return {};
	vector<pair<int, int>> zeros;
	vector<vector<int>> res(matrix.size(), vector<int>(matrix[0].size(), INT_MAX));
	queue<pair<int, int>> q;
	for (int i = 0; i < matrix.size(); i++) {
		for (int j = 0; j < matrix[0].size(); j++) {
			if (matrix[i][j] == 0) {
				q.push(make_pair(i, j));
				res[i][j] = 0;
			}
		}
	}
	updateMatrixCore(matrix, q,res);
	return res;
}
};

相關推薦

01 Matrix 01 矩陣

給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。 兩個相鄰元素間的距離為 1 。 示例 1:  輸入: 0 0 0 0 1 0 0 0 0 輸出: 0 0 0 0 1 0 0 0 0 示例 2:  輸入: 0 0 0 0 1 0 1 1

LeetCode 542. 01 Matrix

lee date iostream tco ble nbsp bsp pop 輸出 輸入:只包含0,1的矩陣 輸出:元素1到達最近0的距離 算法思想:廣度優先搜索。 元素為0為可達區域,元素為1為不可達區域,我們的目標是為了從可達區域不斷地擴展至不可達區域,在擴展的

542. 01 Matrix

pre region style cells out clas tip sem 使用 Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The di

leetcode542 01 Matrix

leetcode i++ strong == leet div urn rst str 思路: 多個起點的bfs。 實現: 1 class Solution 2 { 3 public: 4 vector<vector<int>> u

[leetcode] 542. 01 Matrix (Medium)

給予一個矩陣,矩陣有1有0,計算每一個1到0需要走幾步,只能走上下左右。 解法一: 利用dp,從左上角遍歷一遍,再從右下角遍歷一遍,dp儲存當前位置到0的最短距離。 十分粗心的搞錯了col和row,改了半天………… Runtime: 132 ms, faster than 98.88% of

542. 01 Matrix(Two pass,動態規劃)

Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The distance between two adjacent cells is 1. Example 1: Input: 0 0

圖論01—最短路矩陣(FLOYD)演算法

%======================================================== %最短路矩陣演算法,FLOYD演算法 %針對性:方案預算,能求出所有點之間的最短路(最小費用等) %=============================

[LeetCode]542. 01 Matrix

給一個二維01陣列,找出每個位置和最近的0的距離 BFS 先把所有0入隊,把1置為MAX_VALUE,然後把最靠近0的1的距離算出來,然後將他們入隊,再算距離最靠近0的1的1的距離算出來,依次處理 public class Solution { pu

[演算法分析與設計] leetcode 每週一題: 542. 01 Matrix

題目連結: 題目大意: 給定一個只有0和1的二維陣列,找到 每個值為1的元素離值為0的元素的最近距離(相鄰格距離為1) 樣例: input: 0 0 0 0 1 0 1 1 1 output: 0 0 0 0 1 0 1 2 1

01二維矩陣中最大全為1的正方形maxSquare

在一個二維01矩陣中找到全為1的最大正方形 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Solution1:該題目可以採用暴力搜尋的方式獲取結果,依次以矩陣中每一個點為正方形的左上角進行遍歷並篩選出最大邊長的正方形,具

[Leetcode] spiral matrix 螺旋矩陣

訪問 example play == 題意 blog 針對 mar order Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral

[Leetcode] set matrix zeroes 矩陣置零

div const amp 列數 clas size cto target 參考 Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. cl

hdu 5015 233 Matrix矩陣高速冪)

question can 關系 fin output matrix test case have padding 233 Matrix Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 655

leetcode 566 Reshape the Matrix 重塑矩陣

shape HA 方法 i++ 復習 vector 目標 spa turn 參考:https://www.cnblogs.com/grandyang/p/6804753.html 註意:復習容器的定義方法?? class Solution { public:

codeforces D. Vasya And The Matrix(思維+矩陣+異或)

題意:給定一個n*m的矩陣(未知),以及每一行的各個元素的異或和,每一列的各個元素的異或和,求出一個符合的矩陣(任意即可) 題意:思維很重要,考慮特例的話,只需要考慮最後一行和最後一列,除了最後一行和最後一列,矩陣的其他元素為0,最後,矩陣第n行和第m列之間存在一個方程關係,來求出最後一個元

Leetcode566.Reshape the Matrix重塑矩陣

在MATLAB中,有一個非常有用的函式 reshape,它可以將一個矩陣重塑為另一個大小不同的新矩陣,但保留其原始資料。 給出一個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。 重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。

【LeetCode】Spiral Matrix(螺旋矩陣)

這是LeetCode裡的第54道題。 題目要求: 給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。 示例 1: 輸入: [ [ 1,

LeetCode Day43 Spiral Matrix 螺旋矩陣

矩陣為m×n,環數為min(m,n)/2,設p,q為環的高度和寬度 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) {

LeetCode-566. Reshape the Matrix 重塑矩陣

一、問題描述 In MATLAB, there is a very useful function called ‘reshape’, which can reshape a matrix into a new one with different size but keep its ori

73. Set Matrix Zeroes 矩陣賦零

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: