【思路详解+详细注释】小白都能看懂的力扣算法详解——位运算

一 LC78.子集

题目要求:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

78. 子集 - 力扣(LeetCode)

思路分析:

       利用位运算生成所有子集。每个子集可以表示为一个二进制数,其中每一位表示对应的元素是否被包含在子集中。

完整代码示例:

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
         List<List<Integer>> result = new ArrayList<>();
        int n = nums.length;
        int total = 1 << n; // 2^n subsets

        for (int mask = 0; mask < total; mask++) {
            List<Integer> subset = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                if ((mask & (1 << i)) != 0) {
                    subset.add(nums[i]);
                }
            }
            result.add(subset);
        }
        
        return result;
    }
}

二 LC287.寻找重复数

题目要求:

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

287. 寻找重复数 - 力扣(LeetCode)

思路分析:

       首先,构建一个虚拟链表。数组的每个值都指向一个位置,这样就可以将问题转化为链表中的环检测问题。我们需要做的就是找到成环的位置。具体步骤可以参考【思路详解+详细注释】小白都能看懂的力扣算法详解——链表_链表遍历力扣-CSDN博客

完整代码示例:

class Solution {
    public int findDuplicate(int[] nums) {
        int slow = nums[0];
        int fast = nums[0];
t
        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while (slow != fast);

        slow = nums[0]; 
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }

        return slow;
    }
}

三 LC136.只出现一次的数字

题目要求:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

136. 只出现一次的数字 - 力扣(LeetCode)

思路分析:

       对数组中的所有元素进行异或操作,成对出现的元素会相互抵消,最终结果会是那个只出现一次的元素。

完整代码示例:

class Solution {
    public int singleNumber(int[] nums) {
         int result = 0;
        for (int num : nums) {
            result ^= num;  // 对所有元素进行异或
        }
        return result;    // result 即为只出现一次的元素
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值