78.LeetCode/子集问题 - 使用辅助函数接受解决方案,但否则会超出内存限制

问题描述 投票:0回答:1

我试图使用位操作技术解决 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 bit-manipulation subset
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.