Pascal's Triangle

题目描述

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]
]

题目思路:

把每一行的数据看作一个list,每行的每个数据按顺序存入list中。再把整个一行看作一个整体,存入一个新的list中,这个list的每个元素都是一个list对象。也就是list的嵌套。

分析数字排列结构可以知道,每一行的第一个和最后一个数都是1。每一行的其他位置的数是由上一行对应位置的数a加上a的前一个数的和。对于第一行第二行单独分出即可。

需要注意的是list的下标都是从零开始。

代码1:

import java.util.*;
public class PascalsTriangle {
public ArrayList<ArrayList<Integer>> generate(int numRows) {
//List<List<Integer>>定义一个List,其子元素是List对象,子元素包含的数据是Integer类型
//也就是int的类封装
if (numRows < 0) {
return null;
} ArrayList<ArrayList<Integer>>list = new ArrayList<ArrayList<Integer>>();
//定义一个list作为返回值
if (numRows >= 1) {//大于等于1行时都执行该语句块。
ArrayList<Integer> data = new ArrayList<Integer>();
data.add(1);//把数字1加入到data中
list.add(data);//把data作为元素加入list中,这时第一行数据存储结束
} if (numRows >= 2) {//大于等于2行时都执行该语句块。
ArrayList<Integer> data = new ArrayList<Integer>();
data.add(1);
data.add(1);
list.add(data);//data作为第二行数据存入list中
} if (numRows >=3) {
for (int i = 3; i <=numRows; i++) {
ArrayList<Integer> data = new ArrayList<Integer>();
ArrayList<Integer> prev = list.get(i - 2);//下标从零开始,所以是i-2,这里的i
//等于3在list中实际上是下标为2的元素,其前一个元素是下标为1的元素,也就是
//3-2=1.
data.add(1);//第一个数字为1
//第i行有i个数字,且第1个和第i个数字为1
for (int j = 2; j <= i -1; j++) {//计算第2到i-1个的元素数字。(对应在list的下标是1到i-2)
data.add(prev.get(j - 2) + prev.get(j - 1));//是前一行的第j-1和j的数字和。因为
//下标从零开始,所以对应的下标为j-2和j-1
}
data.add(1);//末尾数字为1 list.add(data);//把第i行加入list
}
} return list;
}
public static void main(String[] args) {
PascalsTriangle test=new PascalsTriangle();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
list=test.generate(5);
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
}

代码2:

import java.util.*;
public class PascalsTriangle {
public ArrayList<ArrayList<Integer>> generate(int numRows) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
if(numRows <= 0){
return lists;
}
list.add(1);//上一个判断未执行,则numRows至少为1,
lists.add(new ArrayList<Integer>(list));//无论numRows等于多少,第一行的数据就是1
for(int i = 1; i < numRows; i++){
list.clear();//每次大循环后,list清零
list.add(1);//每行第一个元素为1,对应的下标是0
for(int j = 1; j < i; j++){//下标从1到i-1共i-1个元素。该行一共有i+1个元素,
//i最大为numRows-1,j最大为numRow-2.
list.add(lists.get(i - 1).get(j - 1) + lists.get(i - 1).get(j));
}
list.add(1);//末尾元素为1
lists.add(new ArrayList<Integer>(list));
}
return lists;
}
public static void main(String[] args) {
PascalsTriangle test=new PascalsTriangle();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
list=test.generate(5);
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
}

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 onlyO(k) extra space?

题目思路:题目要求空间复杂度为O(k),我们开辟的数组空间受限

import java.util.*;
import java.lang.*;
public class Solution {
public ArrayList<Integer> getRow(int rowIndex) {
int[] last=new int[rowIndex+1];
int[] now=new int[rowIndex+1];
int[] tmp=new int[rowIndex+1];//中间转换数组,因为数组之间的直接赋值是引用
//最后指向和操作的还是同一个数据块
last[0]=1;
for(int i=1;i<=rowIndex;i++){
now[0]=1;
now[i]=1;
for(int j=1;j<i;j++){
now[j]=last[j-1]+last[j];
}
// tmp的作用是交换last和now的引用值。主要是保存当前的now为last,用于
//下次循环的计算,now不能再指向当前的now,应指向其他的数据块,值不必管,
//下次循环计算时now的值会被重新赋值
tmp=last;//tmp指向了last的数据块,
last=now;//last指向了now的数据块
now=tmp;//now指向了last的数据块
} ArrayList ans=new ArrayList<Integer>(); for(int i=0;i<=rowIndex;i++){
ans.add(last[i]);
}
return ans;
}
public static void main(String[] args) {
ArrayList<Integer> mylist=new ArrayList<Integer>();
Solution mytest=new Solution();
mylist=mytest.getRow(4);
System.out.println(mylist);
}
}

leetcode题目解答报告(2)的更多相关文章

  1. leetcode题目解答报告(1)

    Remove Element 题目: Given an array and a value, remove all instances of that value in place and retur ...

  2. LeetCode题目解答

    LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...

  3. 全部leetcode题目解答(不含带锁)

    (记忆线:当时一刷完是1-205. 二刷88道.下次更新记得标记不能bug-free的原因.)   88-------------Perfect Squares(完美平方数.给一个整数,求出用平方数来 ...

  4. Leetcode题目practice

    目录 Leetcode题目解答 1. 删除最外层的括号 2. 两数之和 3. 宝石与石头 4. 移除元素 5.删除排序数组中的重复项 6.寻找两个有序数组的中位数 7.盛最多水的容器 8.存在重复元素 ...

  5. LeetCode算法题目解答汇总(转自四火的唠叨)

    LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...

  6. LeetCode: Permutations 解题报告

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...

  7. LeetCode题目答案及理解汇总(持续更新)

    面试算法题 dfs相关 全排列 #include<bits/stdc++.h> using namespace std; const int N = 10; //用一个path数组来存储每 ...

  8. leetcode题目清单

    2016-09-24,开始刷leetcode上的算法题,下面整理一下leetcode题目清单.Github-leetcode 1.基本数学 Two Sum Palindrome Number Cont ...

  9. LeetCode 题目总结/分类

    LeetCode 题目总结/分类 利用堆栈: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ http://oj.l ...

随机推荐

  1. net3:DropDownList的动态绑定

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System.Data;using System.Configuration;using System ...

  2. XMPP协议实现原理介绍(转)

    XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...

  3. Linux 虚拟地址与物理地址的映射关系分析【转】

    转自:http://blog.csdn.net/ordeder/article/details/41630945 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文 ...

  4. 标准C程序设计七---42

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  5. 问题:Linux 输入任何命令都显示 -bash: fork: Cannot allocate memory

    应该是某个程序吃掉了所有的内存,只能重启

  6. Xamarin.Forms的基本页面和基本视图

    Xamarin.Forms的基本页面和基本视图   在Xamarin.Forms中,每个App的界面都是一个页面Page.页面的种类有很多种.其中,最常见的页面就是内容页面ContentPage.项目 ...

  7. jenkins的Pipeline代码流水线管理

    1.新建一个pipline任务 2.自写一个简单的pipline脚本 a.Pipeline的脚本语法在Pipeline Syntax中,片段生成器,示例步骤中选择builf:Build a job b ...

  8. Endless Pallet(min-max容斥)

    地址:传送门 分析: 设$x_i$表示第i个点被染成黑色的时间,所求即为$E(max \left \{x_i  \right \})$ 因为$E(X)=\sum_{k=1}^{\infty}i \ti ...

  9. error错误信息状态码含义

    XMLHttpRequest.status: 200:成功. 401:拒绝访问. 403:禁止访问. 404:找不到. 405:方法不被允许. 407:要求进行代理身份验证. 500:内部服务器错误. ...

  10. Java泛型总结---基本用法,类型限定,通配符,类型擦除

    一.基本概念和用法 在Java语言处于还没有出现泛型的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化.例如在哈希表的存取中,JDK1.5之前使用HashMap的 ...