Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帕斯卡';s Triangle II:Java:它能在O(1)空间复杂度下完成吗? 投入:3 输出:[1,3,3,1]_Java - Fatal编程技术网

帕斯卡';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;
    }
}