zoukankan      html  css  js  c++  java
  • 【Leetcode】【Easy】Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle.

    For example, given k = 3,
    Return [1,3,3,1].

    Note:
    Could you optimize your algorithm to use only O(k) extra space?

    解题思路1(实现巧妙,但时间复杂度高):

    空间复杂度O(k),时间复杂度O(k^2)

    Pascal's Triangle类似,每一行数列,从后往前找规律:f(k)(n) = f(k-1)(n) + f(k-1)(n-1)

    为了只使用O(k)空间,下一层数列可以在旧层数列基础上,从后往前更新。新一层已经更新的数字,不会影响到新一层中,还未更新的数字的计算。

    代码:

     1 class Solution {
     2 public:
     3     vector<int> getRow(int rowIndex) {
     4         vector<int> row(rowIndex + 1);
     5         
     6         row[0] = 1;
     7         for(int i = 1; i <= rowIndex; i++)
     8             for(int j = i; j >= 0; j--)
     9                 if (j == i)
    10                     row[j] = row[j-1];
    11                 else if (j == 0)
    12                     row[j] = row[j];
    13                 else
    14                     row[j] = row[j-1] + row[j];
    15                     
    16         return row;                    
    17     }
    18 };

    解题思路2(寻找公式,直接得出):

    空间复杂度O(k),时间复杂度O(k)

    根据数字规律,给出一个k,可以直接得到对应数列,不必通过前一个数列求值。

    公式:

    f(0) = 1;

    f(n) = f(n-1)(k-n+1) / i      n∈[1,k]

    记录1(int越界出错):

    当k=30时,求出f(14),要求f(15)时,由于要先乘(k-n+1)再除 i,因此做乘法时数值超出了int的最大范围+2147483647;

    代码(未通过):

     1 class Solution {
     2 public:
     3     vector<int> getRow(int rowIndex) {
     4         vector<int> row(rowIndex + 1);
     5         row[0] = 1;
     6         
     7         for (int i=1; i<=rowIndex; ++i) {
     8             row[i] = row[i-1] * (rowIndex-i+1) / i;
     9         }
    10         
    11         return row;
    12     }
    13     
    14 };

    修改(AC):

    将运算中的值暂时double,结果再转回int(12行)

     1 class Solution {
     2 public:
     3     vector<int> getRow(int rowIndex) {
     4         vector<int> row(rowIndex + 1);
     5         row[0] = 1;
     6         
     7         for (int i=1; i<=rowIndex; ++i) {
     8             row[i] = int(double(row[i-1]) * double(rowIndex-i+1) / i);
     9         }
    10         
    11         return row;
    12     }
    13     
    14 };

    附录:

    杨辉三角与计算机

  • 相关阅读:
    HDU 1170 Balloon Comes!
    深入学习QWidget-1
    UI复习练习_优酷布局
    【IOS】 readonly IOS下实战入门
    Android--推断文本文件编码
    2、应用设置之属性、名词等解析
    QT国际化,中英文等多语言界面显示的方法
    利用Java编写简单的WebService实例
    隐式意图调用系统自带组件的各种Uri总结
    Spring MVC学习-----------springMVC-mvc.xml
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4133049.html
Copyright © 2011-2022 走看看