78.LeetCode/Subsets problem - 使用辅助函数接受解决方案,但内存限制超出其他 [closed]

78.LeetCode/Subsets problem - Solution accepted using helper function, but Memory Limit Exceeds otherwise [closed]

提问人:RAKSHA PADIYAR 提问时间:10/29/2023 最后编辑:RAKSHA PADIYAR 更新时间:10/29/2023 访问量:66

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

25天前关闭。

我试图使用位操作技术解决 LeetCode 中型问题子集 [链接 (https://leetcode.com/problems/subsets/)。

首先,我实现了如下解决方案:

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        int num=(int)Math.pow(2,nums.length);
        List<List<Integer>> ans = new ArrayList<>();
        for(int i=0;i<num;i++)
        {
          List<Integer> ls = new ArrayList<>();
          int addNum=nums.length-1;
          while(i>0)
          {
            if((i&1)!=0)
            {
               ls.add(nums[addNum]);
            }
            addNum--;
            i=i>>1;
          }
          ans.add(ls);
        }
        return ans;
    }
}

此解决方案在运行时出现“超出内存限制”错误。

在检查解决方案部分时,我发现另一个用户实现的解决方案与我的逻辑完全相同,但使用辅助函数。

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
       List<List<Integer>> ans=new ArrayList<>();
       int num = (int)Math.pow(2,nums.length);
       for(int i=0;i<num;i++)
       {
         List<Integer> ls = helper(i,nums);
         ans.add(ls);
       }
       return ans;
    }
    public List<Integer> helper(int i, int[] nums)
    {
      List<Integer> ls = new ArrayList<>();
      int j=0;
      while(i>0)
      {
         int rem=i&1;
         if(rem==1)
         {
           ls.add(nums[j]);
         }
         j++;
         i=i>>1;
      }
      return ls;
    }
}

此解决方案被接受。

这两个代码基本上都是一样的。有人可以帮我为什么第一个代码给出超出内存限制。

Java 位操作 子集

评论

0赞 PaulMcKenzie 10/29/2023
这两个代码基本上都是在做同样的事情——你为什么不标记你正在使用的实际计算机语言呢?如果您使用计算机语言的方式存在问题,导致差异,那么至少熟悉该语言的人会指出来。
0赞 PaulMcKenzie 10/29/2023
我发现一个由另一个人实现的解决方案使用与我的逻辑完全相同,但使用辅助函数。--那它和你的不完全一样。如果我对两组代码进行了“差异”,则存在一些差异。我认为您正在尝试通过视觉运行程序,而不是在调试器下运行,这将揭示差异是什么。
0赞 RAKSHA PADIYAR 10/29/2023
你好 Paul,我正在使用 Java。我现在已经标记了它。这是我在stackoverflow上的第一个问题,所以,谢谢你的建议。
0赞 RAKSHA PADIYAR 10/29/2023
我并不是说每行代码都匹配。问题的“逻辑”或“解决问题的策略”完全相同。
0赞 PaulMcKenzie 10/29/2023
当你编写一个程序时,计算机并不关心“逻辑”是什么——无论你是否犯了错误,它都会完全遵循你写的内容。显然,这两个代码在实际执行的内容方面并不相同。这就是为什么学习如何使用调试器是必不可少的。

答:

0赞 RAKSHA PADIYAR 10/29/2023 #1

问题在于 while 循环中的破坏性修改,这影响了外部 for 循环中的增量。i

评论

0赞 Community 10/29/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。