一 LC78.子集
题目要求:
给你一个整数数组
nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
思路分析:
利用位运算生成所有子集。每个子集可以表示为一个二进制数,其中每一位表示对应的元素是否被包含在子集中。
完整代码示例:
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)
的额外空间。
思路分析:
首先,构建一个虚拟链表。数组的每个值都指向一个位置,这样就可以将问题转化为链表中的环检测问题。我们需要做的就是找到成环的位置。具体步骤可以参考【思路详解+详细注释】小白都能看懂的力扣算法详解——链表_链表遍历力扣-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
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
思路分析:
对数组中的所有元素进行异或操作,成对出现的元素会相互抵消,最终结果会是那个只出现一次的元素。
完整代码示例:
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num; // 对所有元素进行异或
}
return result; // result 即为只出现一次的元素
}
}