讨论/《数组和字符串》 - 杨辉三角/
《数组和字符串》 - 杨辉三角
共 14 个回复

C++

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> ret;
        if(numRows==0) return ret;
        ret.push_back(vector<int>(1,1));
        for(int i=1;i<numRows;i++){
            vector<int> a(i+1);
            for(int j=0;j<=i;j++){
                if(j==0||j==i) a[j]=1;
                else a[j]=ret[i-1][j-1]+ret[i-1][j];
            }
            ret.push_back(a);
        }
        return ret;
    }
};
4
class Solution {
    public List<List<Integer>> generate(int numRows) {


		List<List<Integer>> list = new ArrayList<>();
		for (int i = 0; i < numRows; i++) {

			List<Integer> l1 = new ArrayList<>();

			int num = 1;

			if (i > 1) {
				for (int j = 0; j <= i; j++) {
					int value = 0;
					if (j - 1 >= 0 && j <= i - 1) {
						List<Integer> preList = list.get(i - 1);
						value += preList.get(j - 1);
						value += preList.get(j);
					} else {
						value = 1;
					}
					l1.add(value);
				}
			} else {
				for (int j = 0; j <= i; j++) {
					l1.add(num);
				}
			}
			list.add(l1);
		}

		return list;
	
    }
}
1

Python3

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        '''
        思路: 在杨辉三角中,每个数是它左上方和右上方的数的和
        方法: 每一行等于上一行前后错位后之和
                13310
               +01331
                14641
        '''
        ret = []
        for i in range(numRows):
            row = []
            for j in range(0, i+1):
                if j == 0 or j == i:
                    row.append(1)
                else:
                    row.append(ret[i-1][j] + ret[i-1][j-1])
            ret.append(row)
        return ret
1

<Python> 先生成一个全为1的杨辉三角,然后从第三行开始计算除去两边的中间元素就可以了

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        res = [[1] * i for i in range(1,numRows+1)]
        for m in range(2, numRows):
            for n in range(1, m):
                res[m][n] = res[m-1][n-1] + res[m-1][n]
        return res
1

本层杨辉三角的数据,从上至下一层一层计算!!

哥,第六行表达的是什么意思呀。

第一次自己写递归,记录一下

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        if(numRows==0)  return {{}};
        if(numRows==1)  return {{1}};
        vector<vector<int>> res = generate(numRows-1);
        vector<int> tmp(numRows);
        tmp[0] = 1;
        tmp[numRows-1] = 1;
        for(int i=1; i<numRows-1; i++)
        {
            tmp[i] = res[numRows-2][i-1] + res[numRows-2][i];
        }
        res.push_back(tmp);
        return res;
    }
};
public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> rowItems = new ArrayList<>();
    if (numRows == 1) {
      rowItems.add(1);
      result.add(rowItems);
      return result;
    }

    for (int i = 1; i <= numRows; i++) {
      rowItems = new ArrayList<>();
      for (int j = 0; j <= i - 1; j++) {
        if (j == 0 || j == i - 1) {
          rowItems.add(1);
        } else {
          List<Integer> rowValues = result.get(i - 2);
          Integer leftVal = rowValues.get(j - 1);
          Integer rightVal = rowValues.get(j);
          rowItems.add(leftVal + rightVal);
        }
      }
      result.add(rowItems);
    }

    return result;
}
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ans = new ArrayList<>(numRows);
        for (int i = 0; i < numRows; i++) {
            List<Integer> item = new ArrayList<>(i + 1);
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    item.add(1);
                    continue;
                }
                List<Integer> pre = ans.get(i - 1);
                item.add(pre.get(j - 1) + pre.get(j));
            }
            ans.add(item);
        }
        return ans;
    }

大一就写过杨辉三角,现在大三又来写,仿佛LeetCode想告诉我,现在的水平和大一没啥区别...

     List<List<Integer>> res = new ArrayList<>(numRows);
        List<Integer> l = new ArrayList<>();
        l.add(1);
        res.add(l);
        for (int i = 1; i < numRows; i++) {
            l = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                int n1 = 0, n2 = 0;
                if (j - 1 >= 0) {
                    n1 = res.get(i - 1).get(j - 1);
                }
                if (j < res.get(i - 1).size()) {
                    n2 = res.get(i - 1).get(j);
                }
                l.add(n1 + n2);
            }
            res.add(l);
        }
        return res;