二进制数位 ai 若为 0,表示第 i 位未被选中;若为 1,表示第 i 位被选中。而要分析一个压缩的状态,即获取表示该状态二进制数各位的值,可以运用位运算的操作。由于一个二进制数和 1 进行按位与(&)操作得到的结果将只由该数的最低位决定,如果最低位为 0,则运算结果为 0,否则为 1. 由此可以想到,将一个状态数依次右移 n 位得到一个以 an 结尾的二进制数,再将该二进制数和 1 进行按位与得到 an 的值。依次遍历所有的右移步数得到该状态的所有信息。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { private: std::vector<std::vector<int>> Sets; public: std::vector<std::vector<int>> getSubset(std::vector<int>& nums) { int n = nums.size(); std::vector<int> subset; for (int i = 1; i <= (1 << n); ++i) { subset.clear(); for (int j = 0; j < n; ++j) { int isChoosed = i >> j & 1; if (isChoosed) subset.emplace_back(nums[j]); } Sets.emplace_back(subset); } return Sets; } };