顺序表练习题
一、杨辉三角
1.1分析方法
class Solution {
public List<List<Integer>> generate(int numRows) {
}
}
1.首先来分析一下这个类的方法,方法名generate,参数是一个整型数组,重点是返回值,返回值List<List>,List表示接口,可以引用实现了它的类,比如ArrayList、LinkedList,TreeSet,先来看List<List>的内部List,举个例子:
List<Integer> list = new ArrayList<>();
list.add(1);
2.<>表示泛型,之前有讲过,可以传类型,这里是Integer类型,因为ArrayList实现了这个接口,所以可以被引用,可以理解为向上转型,那么list就可以调用List接口的方法,这也是面向对象的特点,直接用,不用关注具体实现细节。
3.理解了内部之后,剩下的就很简单了,外部也是一个List<>,也表示它是一个泛型,可以传类型,那么传给它的类型就是刚刚解释的List,结合这道杨辉三角来看就可以理解为这个方法的返回值是一个二维数组。
List<List<Integer>> list1 = new ArrayList<>();
list1.add(new ArrayList<>());
list1.add(new ArrayList<>());
可以理解为下面这个图。
1.2分析思路
我们返回的是一个二维数组,而二维数组的内容,就是对应的每一行杨辉三角。那现在我们要做的就是定义一个List<List>,然后往里面存储每一行的list,那么同样的也要定义一个List用来存放每一行的数字,第一行就是1个数字1,我们可以先定义好。之后我们就从第二行开始遍历,写每一行。
每一行0位置都是1,从第二个元素开始,用i遍历行,用j遍历每一行的元素,那么[i,j]元素等于上一行的[j]位置和[j-1]位置相加,即[i][j] = [i-1,j-1]+[i-1,j]。此时我们要先获取上一行,并且获取行中的这两个元素。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> list = new ArrayList<>();//定义第一行
list.add(1);//向第一行中添加元素
ret.add(list);//将第一行存入二维数组中
for(int i = 1;i<numRows;i++){//从第二行开始
List<Integer> curRow = new ArrayList<>();//定义当前行
//第一个数字
curRow.add(1);
//获取上一行
List<Integer> preRow = ret.get(i-1);
for(int j = 1;j<i;j++){//中间数字
//当前数字等于上一行的j+j-1 要先获取上一行
//再获取上一行的元素
int val = preRow.get(j) + preRow.get(j-1);
curRow.add(val);
}
//最后一个数字
curRow.add(1);
//将这一行存到二维数组中
ret.add(curRow);
}
//走完循环返回
return ret;
}
}
}
//走完循环返回
return ret;
}
}