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. 根据已知日期(yyyy-MM-dd)获取前n天的日期区间

    //获取天 var pubTime="2017-12-30" function buildDay(num){ num=num-1; var myDate = new Date(pu ...

  2. AC日记——[HAOI2015]树上操作 洛谷 P3178

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  3. Python语言 介绍

    一.python介绍python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语 ...

  4. Codeforces 553D Nudist Beach(二分答案 + BFS)

    题目链接 Nudist Beach 来源  Codeforces Round #309 (Div. 1) Problem D 题目大意: 给定一篇森林(共$n$个点),你可以在$n$个点中选择若干个构 ...

  5. bzoj 1835/luogu P2605 : [ZJOI2010]base 基站选址

    题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ...

  6. IntelliJ IDEA ,springboot 2.0 +mybatis 创建和访问数据库

    环境: JDK8+windows10 步骤 New Module —>Spring Initializr—>next 1 ​ 2. ​ 3.web勾选web,sql里面可以不勾,后续添加, ...

  7. spring lifeCycle

    Lifecycle接口定义了每个对象的生命周期.如下 public interface Lifecycle { void start(); void stop(); boolean isRunning ...

  8. 跟开涛学SpringMVC(4.1):Controller接口控制器详解(1)

    http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/52074530 https:/ ...

  9. c#中开发ActiveX的学习笔记【转】

    http://www.cnblogs.com/yjmyzz/archive/2009/12/14/1623396.html 1.为什么要用ActiveX? 网页本身的功能是有限的,要想实现一些网页本身 ...

  10. C#使用CurrentUICulture切换语言

    1. 创建2个窗口   2. 窗口1属性Localizable设置为True,Language选择英语(美国) 然后把窗口1中控件的Text由中文编辑成英文,Form2一样设置.   此时,Form1 ...