杨辉三角-list实现(优化)

计算杨辉三角前6行(升级版),list实现

    值如下:
    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]
  • 思路:

        上一个实现的思路,下一行的数字是基于上一行的数字求得而来,那么则只需要使用两
        个内存空间,分别来保存这两行数字.一个保存上一行的数字,另一行则保存求得的下一
        行数字.一轮循环后,新生成的下一行变成了旧行,新行清空重新计算并填充.
  • 优化思路:
        直接开辟一个足够大的内存空间,在此内存空间中来模拟旧行和新行的关系,如直接将新行的内容覆盖旧行的内容.
        优点:
            内存空间的消耗减少,时间复杂度不比上一个实现差.
  • 代码实现:
    l1=[1]*6          # 开辟一个长度为6的列表
    print(l1[:1])         
    print(l1[:2])
    for i in range(2,6):
        a=[1]                       # 定义及重置
        for j in range(1,i//2+1):          
            a.append(l1[j])         # 将用于计算的数附加至此列表
            if len(a)>2:            # 列表长度大于2时,进行元素处理
                a[0]=a[1]
                a[1]=a[2]
                a.remove(a[2])
            l1[j]=a[0]+a[1]
            if i!=2j:
                l1[i-j]=l1[j]
        print(l1[:i+1])             # 根据切片,只打印所需部分
  • 实现想法:
        上一行与下一行的关系,无非就是两个数相加所得结果是下一行的某一值.在同一列表
        中操作,需要防止生成的新值将用于计算的旧值覆盖.因此需要将用于计算的值保存下
        来.
        我使用的是用列表保存,而且此列表只需要两个值即可,当列表长度超过了3,则代表第
        一个用于计算的值已经使用完,便用后面的两个值覆盖掉.

  • 更优方案:

        每次计算前将要被覆盖的值保存至一个变量中,在下次计算时使用此变量和下一个索引
        的值进行相加同样可以求出此结果.
        优点:
            此处变量比列表效率更高
        注意:
            这个变量要在原值修改之前保存
            在下一轮的计算之前,变量的值没有改变
  • 代码实现:
    l1=[1]*6                  # 开辟长度为6的列表
    print(l1[:1])             # 1,2行做特殊行处理
    print(l1[:2])
    for i in range(2,6):    
        a=1                      
        for j in range(1,i//2+1):       # 将求下一行值分为两步     
            val = l1[j]+a         # 第一步求值
            a = l1[j]             # 将原值先保存至a
            l1[j] = val           # 第二步赋值
            if i!=2j:
                l1[i-j]=l1[j]
        print(l1[:i+1])
  • 实现想法:
        将求值的过程分成两步,先把a和索引对应的值的和保存至变量val中,再把即将要被覆
        盖的值保存至a,最后在将val的值覆盖至事先保存的变量位置.
时间: 2024-09-30 20:40:32

杨辉三角-list实现(优化)的相关文章

杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析

说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一  基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三角形中的一种几何排列.此处引用维基百科上的一张动态图以直观说明(原文链接http://zh.wikipedia.org/wiki/杨辉三角): 从上图可看出杨辉三角的几个显著特征: 1. 每行数值左右对称,且均为正整数. 2. 行数递增时,列数亦递增. 3. 除斜边上的1外,其余数值均等于其肩部两数

[LeetCode] 119. Pascal's Triangle II 杨辉三角 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? 118. Pascal's Triangle 的拓展,给一个索引k,返回杨辉三角的第k行. 解法:题目要求优化到 O(k) 的空间复杂,那么就不能把每

Golang实现杨辉三角

杨辉三角,也算是一个经典的题目了.就简单的说说. 写代码之前,先分析要做的东西的特点,找到规律,再把这个规律描述一下. 然后把这个描述翻译成编程语言,就可以说是编程了. 那么杨辉三角有什么特点? 首先是个三角(感觉这是屁话,但也得说),在数学里边,我们手写画出来,就像一个等腰三角形. 而在计算里边,打印个等腰三角形,还真不不太容易,好在三角的形状不是我们关注的重点,所以,我们这个三角形,是直角三角形,腰没了. 这个三角形有还有什么特点呢? 先是元素个数,这个有个特点,就是当前是第几行,那么这行就

LeetCode (13) Pascal's Triangle (杨辉三角 )

题目描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return 从第三行开始,每行除了最左边和最右边两个数为1,其他数字都是上一行中相邻两个数字之和.根据上述规则可以写出下面的代码: class Solution { public: vector<vector<int> > generateRow1() { vector<in

杨辉三角

1 package com.llh.demo; 2 3 /** 4 * 杨辉三角 5 * 6 * @author llh 7 * 8 */ 9 public class Test { 10 /* 11 * 杨辉三角 12 */ 13 public static void main(String[] args) { 14 int[] a = new int[11]; 15 int num = 1; 16 // 17 for (int i = 1; i <= 10; i++) { 18 for (i

杨辉三角实例菱形实例

杨辉三角实例 public class Hui { public static void main (String [] args){ int [][] a =new int [10][10]; for(int i=0;i<a.length;i++){ for(int j=0;j<=i;j++){ if(j==0||i==j){ System.out.print(" "+(a[i][j]=1)); }else {a[i][j]=a[i-1][j-1]+a[i-1][j];

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

使用Java打印杨辉三角

package 杨辉三角; import java.util.Scanner; public class 三角 { private static Scanner scn; public static void main(String[] args) { scn = new Scanner(System.in); System.out.println("请输入数据"); int n = scn.nextInt(); //定义一个二维数组 int [][] array = new int

Java的二维数组的应用及杨辉三角的编写

(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个,即该位置上的元素在该行上最大,在该列上最小(注:一个二维数组也可能没有这样的鞍点). /** * * @author liuhui *@version Java上机实验三 *@time 2016.10.30 */ public class javatest2 { public static int