剑指Offer(十九):顺时针打印矩阵

剑指Offer(十九):顺时针打印矩阵

一、前言

本系列文章为《剑指Offer》刷题笔记。

刷题平台:牛客网

书籍下载:共享资源

二、题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

剑指Offer(十九):顺时针打印矩阵

则依次打印出数组:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。

1、思路

将结果存入vector数组,从左到右,再从上到下,再从右到左,最后从下到上遍历。

2、代码

C++:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int rows = matrix.size();			//行数
        int cols = matrix[0].size();		//列数
        vector<int> result;
        
        if(rows == 0 && cols == 0){
            return result;
        }
        int left = 0, right = cols - 1, top = 0, bottom = rows - 1;
        
        while(left <= right && top <= bottom){
            //从左到右
            for(int i = left; i <= right; ++i){
                result.push_back(matrix[top][i]);
            }
            //从上到下
            for(int i = top + 1; i <= bottom; ++i){
                result.push_back(matrix[i][right]);
            }
            //从右到左
            if(top != bottom){
                for(int i = right - 1; i >= left; --i){
                    result.push_back(matrix[bottom][i]);
                }
            }
            //从下到上
            if(left != right){
                for(int i = bottom - 1; i > top; --i){
                    result.push_back(matrix[i][left]);
                }
            }
            left++, top++, right--, bottom--;
        }
        return result;
    }
};

Python2.7:

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        rows = len(matrix)
        cols = len(matrix[0])
        result = []
        if rows == 0 and cols == 0:
            return result
        left, right, top, buttom = 0, cols - 1, 0, rows - 1
        while left <= right and top <= buttom:
            for i in range(left, right+1):
                result.append(matrix[top][i])
            for i in range(top+1, buttom+1):
                result.append(matrix[i][right])
            if top != buttom:
                for i in range(left, right)[::-1]:
                    result.append(matrix[buttom][i])
            if left != right:
                for i in range(top+1, buttom)[::-1]:
                    result.append(matrix[i][left])
            left += 1
            top += 1
            right -= 1
            buttom -= 1
        return result

题目变型:

给定一个数字2,打印矩阵:

剑指Offer(十九):顺时针打印矩阵

给定一个数字3,打印矩阵:

剑指Offer(十九):顺时针打印矩阵

给定一个数字4,打印矩阵:

剑指Offer(十九):顺时针打印矩阵

Python:

# -*- coding:utf-8 -*-

def matrix(target):
	num = target * target
	left, right, top, bottom = 0, target-1, 0, target-1
	res = [ [0 for col in range(target)] for row in range(target)]
	each = 1
	while left <= right and top <= bottom and each <= num:
		for i in range(left, right+1):
			res[top][i] = each
			each += 1
		for i in range(top+1, bottom+1):
			res[i][right] = each
			each += 1
		if top != bottom:
			for i in range(left, right)[::-1]:
				res[bottom][i] = each
				each += 1
		if left != right and each <= num:
			for i in range(top+1, bottom)[::-1]:
				res[i][left] = each
				each += 1
		top += 1
		left += 1
		bottom -= 1
		right -= 1
	for i in range(len(res)):
		print("\t".join('%s' %id for id in res[i]))

if __name__ == '__main__':
	matrix(4)

来源:

https://cuijiahua.com/blog/2017/12/basis_19.html

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?