【LeetCode】118. 杨辉三角

118. 杨辉三角

难度:简单

题目

给定一个非负整数 *numRows,*生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

在这里插入图片描述

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

提示:

  • 1 <= numRows <= 30

个人题解

思路:

分析,每层有i个元素,一共有i行

  1. 每层的第一个和最后一个元素必定为1;
  2. 其他元素都是上一层元素的当前索引位置和当前索引位置前一个;

遍历时考虑好上面两种情况即可

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ans = new ArrayList<>();
        int times;
        for (int i = 0; i < numRows; i++) {
            List<Integer> curLevelList = new ArrayList<>();
            times = i + 1;
            for (int j = 0; j < times; j++) {
                if (j==0 || j == times - 1) {
                    curLevelList.add(1);
                } else {
                    curLevelList.add(ans.get(i - 1).get(j-1) + ans.get(i - 1).get(j));
                }
            }
            ans.add(curLevelList);
        }
        return ans;
    }
}

进阶:

  1. 上面层的概念是用list来表示的,分析一下,
    • 如果用一个指针指向下一层的头节点,即可得到每层遍历的起点
    • 再考虑用一个尾指针表示下一层的尾节点,则遍历当前层时即可将下一层的节点接在尾节点上
  2. 经过上述分析,遍历过程不再需要list容器,只需要3个指针即可,当前层遍历指针,下一层头指针及下一层尾指针
  3. 每次遍历完当前层,将下一层头指针及尾指针重置
class Solution {
    public Node connect(Node root) {
        Node curTail = root;
        Node nextHead = null;
        Node nextTail = null;
        while (curTail != null) {
            // 看左子结点
            if (curTail.left != null) {
                if (nextTail != null) {
                    nextTail.next = curTail.left;
                } else {
                    nextHead = curTail.left;
                }
                nextTail = curTail.left;
            }
            // 看右子结点
            if (curTail.right != null) {
                if (nextTail != null) {
                    nextTail.next = curTail.right;
                } else {
                    nextHead = curTail.right;
                }
                nextTail = curTail.right;
            }
            if (curTail.next != null) {
                // 继续当前层遍历
                curTail = curTail.next;
            } else {
                // 当前层遍历完毕,开启下一层遍历,将下一层指针重置
                curTail = nextHead;
                nextHead = null;
                nextTail = null;
            }
        }
        return root;
    }
}

不讲武德题解:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        Integer[][] a= {{1},
                {1, 1},
                {1, 2, 1},
                {1, 3, 3, 1},
                {1, 4, 6, 4, 1},
                {1, 5, 10, 10, 5, 1},
                {1, 6, 15, 20, 15, 6, 1},
                {1, 7, 21, 35, 35, 21, 7, 1},
                {1, 8, 28, 56, 70, 56, 28, 8, 1},
                {1, 9, 36, 84, 126, 126, 84, 36, 9, 1},
                {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1},
                {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1},
                {1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1},
                {1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1},
                {1, 14, 91, 364, 1001, 2002, 3003, 3432, 3003, 2002, 1001, 364, 91, 14, 1},
                {1, 15, 105, 455, 1365, 3003, 5005, 6435, 6435, 5005, 3003, 1365, 455, 105, 15, 1},
                {1, 16, 120, 560, 1820, 4368, 8008, 11440, 12870, 11440, 8008, 4368, 1820, 560, 120, 16, 1},
                {1, 17, 136, 680, 2380, 6188, 12376, 19448, 24310, 24310, 19448, 12376, 6188, 2380, 680, 136, 17, 1},
                {1, 18, 153, 816, 3060, 8568, 18564, 31824, 43758, 48620, 43758, 31824, 18564, 8568, 3060, 816, 153, 18, 1},
                {1, 19, 171, 969, 3876, 11628, 27132, 50388, 75582, 92378, 92378, 75582, 50388, 27132, 11628, 3876, 969, 171, 19, 1},
                {1, 20, 190, 1140, 4845, 15504, 38760, 77520, 125970, 167960, 184756, 167960, 125970, 77520, 38760, 15504, 4845, 1140, 190, 20, 1},
                {1, 21, 210, 1330, 5985, 20349, 54264, 116280, 203490, 293930, 352716, 352716, 293930, 203490, 116280, 54264, 20349, 5985, 1330, 210, 21, 1},
                {1, 22, 231, 1540, 7315, 26334, 74613, 170544, 319770, 497420, 646646, 705432, 646646, 497420, 319770, 170544, 74613, 26334, 7315, 1540, 231, 22, 1},
                {1, 23, 253, 1771, 8855, 33649, 100947, 245157, 490314, 817190, 1144066, 1352078, 1352078, 1144066, 817190, 490314, 245157, 100947, 33649, 8855, 1771, 253, 23, 1},
                {1, 24, 276, 2024, 10626, 42504, 134596, 346104, 735471, 1307504, 1961256, 2496144, 2704156, 2496144, 1961256, 1307504, 735471, 346104, 134596, 42504, 10626, 2024, 276, 24, 1},
                {1, 25, 300, 2300, 12650, 53130, 177100, 480700, 1081575, 2042975, 3268760, 4457400, 5200300, 5200300, 4457400, 3268760, 2042975, 1081575, 480700, 177100, 53130, 12650, 2300, 300, 25, 1},
                {1, 26, 325, 2600, 14950, 65780, 230230, 657800, 1562275, 3124550, 5311735, 7726160, 9657700, 10400600, 9657700, 7726160, 5311735, 3124550, 1562275, 657800, 230230, 65780, 14950, 2600, 325, 26, 1},
                {1, 27, 351, 2925, 17550, 80730, 296010, 888030, 2220075, 4686825, 8436285, 13037895, 17383860, 20058300, 20058300, 17383860, 13037895, 8436285, 4686825, 2220075, 888030, 296010, 80730, 17550, 2925, 351, 27, 1},
                {1, 28, 378, 3276, 20475, 98280, 376740, 1184040, 3108105, 6906900, 13123110, 21474180, 30421755, 37442160, 40116600, 37442160, 30421755, 21474180, 13123110, 6906900, 3108105, 1184040, 376740, 98280, 20475, 3276, 378, 28, 1},
                {1, 29, 406, 3654, 23751, 118755, 475020, 1560780, 4292145, 10015005, 20030010, 34597290, 51895935, 67863915, 77558760, 77558760, 67863915, 51895935, 34597290, 20030010, 10015005, 4292145, 1560780, 475020, 118755, 23751, 3654, 406, 29, 1}};

        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < numRows; i++) {
            list.add((List<Integer>)Arrays.asList(a[i]));
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值