118. Pascal's Triangle

Swift 3.0

//
//  E_118_Pascal'sTriangle.swift
//  AlgorithmLeetCode
//
//  Created by okerivy on 2017/3/8.
//  Copyright © 2017年 okerivy. All rights reserved.
//  https://leetcode.com/problems/pascals-triangle

import Foundation




// MARK: - 题目名称: 118. Pascal's Triangle

/* MARK: - 所属类别:
 标签: Array
 
 相关题目:
  (E) Pascal's Triangle II
 
 */

/* MARK: - 题目英文:
 Given numRows, generate the first numRows of Pascal's triangle.
 
 For example, given numRows = 5,
 Return
 
 [
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
 ]
 
 */


/* MARK: - 题目翻译:
 给定一个数字,生成一个帕斯卡三角形(杨辉三角)
 例如给定一个数字5 ,返回下面的数组
 [
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
 ]
 
 */



/* MARK: - 解题思路:
 
 要得到一个帕斯卡三角,我们只需要找到规律即可。
 
 第k层有k个元素
 每层第一个以及最后一个元素值为1
 对于第k(k > 2)层第n(n > 1 && n < k)个元素A[k][n],A[k][n] = A[k-1][n-1] + A[k-1][n]
 知道了上面的规律,就很好做了,我们使用一个二维数组来存储整个三角
 
 */


/* MARK: - 复杂度分析:
 时间复杂度 O(n^2), 空间复杂度在最后一位有进位时恶化为 O(n)
 
 */


// MARK: - 代码:
private class Solution {
    func generate(_ numRows: Int) -> [[Int]] {
        
        // 初始化一个二维数组
        var arrays = [[Int]]()
        
        //大于等于1 进行数组的遍历
        if numRows >= 1 {
            // 二维数组 拼接第一个元素(长度为1的,元素为1 一维数组)
            arrays.append([Int](repeating: 1, count: 1))
        
            for i in 1 ..< numRows {
                // 二维数组 拼接其余的元素(长度为i+1的 初始值 为0 的一维数组)
                arrays.append([Int](repeating: 0, count: i+1))
                // 第一个元素设置为1
                arrays[i][0] = 1
                // 最后一个元素设置为1
                arrays[i][i] = 1
                for j in 1 ..< i {
                    // 中间元素 根据规则 进行计算
                    arrays[i][j] = arrays[i - 1][j - 1] + arrays[i - 1][j];
                }
            }
        }

        return arrays
    }
    
    // 递归算法
    // 求杨辉三角中第i行第j列的值
    private func calcTriVal(_ dwRow: Int, _ dwCol: Int) -> Int {
        if 0 == dwCol || dwCol == dwRow {
            return 1
        } else {
            return calcTriVal(dwRow - 1, dwCol - 1) + calcTriVal(dwRow - 1, dwCol)
        }
        
    }
    
    func generate2(_ numRows: Int) -> [[Int]] {
        
        // 初始化一个二维数组
        var arrays = [[Int]]()
        for dwRow in 0 ..< numRows {
            arrays.append([Int](repeating: 0, count: dwRow+1))
            for dwCol in 0 ... dwRow {
                // 对数组进行赋值
                arrays[dwRow][dwCol] =  calcTriVal(dwRow, dwCol)
            }
        }
        
        return arrays
    }
}



// MARK: - 测试代码:

func pascalsTriangle()  {
    
    let numRows = 6
    var arrays = Solution().generate(numRows)
    
    // 按照要求 打印输出 非代码的部分
    print("[")
    for i in 0..<numRows {
        var output = ""
        
        // 拼接空格的个数
        for _ in 0..<numRows-i-1 {
            output.append(" ")
        }
        
        // 拼接数组的其实标志
        output.append("[")
        // 打印不换行
        print("\(output)" ,terminator:"")
        for j in 0...i {
            if j == 0 {
                // 第一个元素打印
                print("\(arrays[i][j])" ,terminator:"")
            } else {
                // 其余元素打印, 前面加逗号
                print(",\(arrays[i][j])" ,terminator:"")
            }
            
        }
        // 打印数组末尾, 换行
        print("]")
        
    }
    print("]")
}



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容