我试图使用位操作技术解决 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;
}
}
该解决方案被接受。
这两个代码的作用基本上是相同的。有人可以帮助我为什么第一个代码给出内存限制超出。
问题是在 while 循环中破坏性地修改了“i”,这影响了外部 for 循环中的增量