题目主要信息
1、蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
2、多组样例输入
方法一:直接遍历输入
具体方法
准备一个的二维矩阵,只填充矩阵上半个三角形,而填充顺序从每行的第一列开始,每次都往右上角方向填充元素,即矩阵行坐标递减,列坐标递增,而填充的数字依次增加就行了。
C++代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n; 
    while(cin >> n){
        vector<vector<int> > num(n, vector<int>(n, 0)); //定义一个n*n的矩阵
        int number = 1;
        for(int i = 0; i < n; i++){
            int j = i, k = 0;
            while(j >= 0){
                num[j][k] = number; //录入数字
                number++;
                j--; //向右上方
                k++;
            }
        }
        //遍历输出
        for(int i = 0; i < n; i++){ 
            int j = 0;
            while(num[i][j] != 0 && j < n){ //每行只输出前面非零部分
                cout << num[i][j] << " ";
                j++;
            }
            cout << endl; //换行
        }
    }
    return 0;
}
复杂度分析
- 时间复杂度:,填充和输出矩阵都遍历个矩阵空间
- 空间复杂度:,使用二维矩阵作为辅助数组
方法二:找到规律
具体方法
- 找出规律即可,如实例输入4
- 第一行:[1 3 6 10]
- 第二行:去掉第一行的第一列,然后将后面的[3 6 10]分别减1得到的。
 
- 先构造第一行,根据规律求第2-n行
- 每一行处理后封装结果到 StringBuilder,注意空格和换行符
Java代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] nums = new int[n];
            StringBuilder result = new StringBuilder();
            for(int i = 0; i < n; i++) {
                // 先构造第一行
                if(i == 0) {
                    int addVal = 2;
                    nums[0] = 1;
                    for(int j = 1; j < n; j++) {
                        nums[j] = nums[j - 1] + addVal;
                        addVal++;
                    }
                } else {
                    // 从第二行开始构造每一列,遍历次数:(len-i)
                    for(int j = 1; j <= n - i; j++) {
                        nums[j - 1] = nums[j] - 1;
                    }
                }
                for(int k = 0; k < n - i; k++) {
                    result.append(nums[k] + " ");
                }
                result.append("\n");
            }
            System.out.println(result.toString().substring(0, result.length() - 1));
        }
    }
}
复杂度分析
- 时间复杂度:,遍历处理每一行每一列所需要的时间复杂度
- 空间复杂度:,维护了大小为n 的数组和结果字符串

 京公网安备 11010502036488号
京公网安备 11010502036488号