帕斯卡';s Triangle II:Java:它能在O(1)空间复杂度下完成吗? 投入:3 输出:[1,3,3,1]
这个问题的链接是 我的解决办法是帕斯卡';s Triangle II:Java:它能在O(1)空间复杂度下完成吗? 投入:3 输出:[1,3,3,1],java,Java,这个问题的链接是 我的解决办法是 class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> pascalList = new ArrayList<>(); rowIndex += 1; int c = 1; for(int i = 1; i <= rowIndex ; i++) {
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascalList = new ArrayList<>();
rowIndex += 1;
int c = 1;
for(int i = 1; i <= rowIndex ; i++) {
pascalList.add(c);
c = c * (rowIndex-i)/i;
}
return pascalList;
}
}
类解决方案{
公共列表getRow(int-rowIndex){
List pascalList=new ArrayList();
行索引+=1;
int c=1;
对于(int i=1;i一种解决方案是将所有计算存储为长,然后将最终列表转换为整数列表。(但是,这会使用O(k)额外空间)
以下是代码:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Long> pascalList = new ArrayList<>();
rowIndex += 1;
long c = 1;
for(int i = 1; i <= rowIndex ; i++) {
pascalList.add(c);
c = c*(rowIndex-i)/i;
}
List<Integer>ans = new ArrayList<>();
for(int i=0;i<rowIndex;i++){
ans.add((int)(long)pascalList.get(i));
}
return ans;
}
}
请注意,c在除法之前将自身乘以(rowIndex-i),这可能会导致溢出-也就是说,c*(rowIndex-i)可能大于最大整数值
为了避免这种情况,如果没有余数,我们可以先除以i。
如果有余数,我们可以将值存储为double,在乘以c之后,希望没有精度错误(注意,由于精度错误,这可能并不总是有效,但在我们的例子中,我们很幸运)
下面是超过100.00%的Java提交的代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascalList = new ArrayList<>();
rowIndex += 1;
int c = 1;
for(int i = 1; i <= rowIndex ; i++) {
pascalList.add(c);
if(c%i==0){
c = c/i*(rowIndex-i);
}else{
c = (int)(c*((rowIndex-i)/(double)i));
}
}
return pascalList;
}
}
类解决方案{
公共列表getRow(int-rowIndex){
List pascalList=new ArrayList();
行索引+=1;
int c=1;
对于(inti=1;i),您不需要显式存储列表元素:查看如何在Javadoc中使用AbstractList
。对于处理溢出:使用范围更广的元素类型。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascalList = new ArrayList<>();
rowIndex += 1;
int c = 1;
for(int i = 1; i <= rowIndex ; i++) {
pascalList.add(c);
if(c%i==0){
c = c/i*(rowIndex-i);
}else{
c = (int)(c*((rowIndex-i)/(double)i));
}
}
return pascalList;
}
}