3.22
Leetcode
子集
class Solution {
public:
vector<vector<int>>ans;
vector<int>path;
void bt(vector<int>& nums, int index){
ans.push_back(path);
for(int i = index; i < nums.size(); i++){
path.push_back(nums[i]);
bt(nums, i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
bt(nums, 0);
return ans;
}
};
子集2
class Solution {
public:
vector<vector<int>>ans;
vector<int>path;
//有问题,代码和思路不匹配,应该省略掉横向的重复组合
//之前有到类似的题
//重点在于相等并加一个判断 或者 i > startindex也可以,这样只会去掉同重复不会去掉纵向的重复
void bt(vector<int>& nums, int index, vector<bool>& condi){
ans.push_back(path);
for(int i = index; i < nums.size(); i++){
if(i > 0 && !condi[i-1] && nums[i] == nums[i-1]) continue;
path.push_back(nums[i]);
condi[i] = true;
bt(nums, i+1, condi);
condi[i] = false;
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<bool>condi(nums.size(), false);
bt(nums, 0, condi);
return ans;
}
};
C++
define和const区别
define宏定义是在预处理阶段处理,没有类型,自然没有类型检查,仅仅依靠宏定义进行字符串的展开,遇到多少次展开多少次。因为define宏定义仅仅是展开,因此系统并不会为宏定义分配内存,但是从汇编角度来讲,define却以立即数的方式保留了多份数据的拷贝
对于const来说,const是在编译期间进行处理的,const有类型,有类型检查,系统运行时也会为const量分配内存,而且从汇编的角度讲,const常量在出现的地方保留的是真正数据的内存地址,只保留了一份数据的拷贝,省去了不必要的内存空间。而且有时候编译器不会为普通的const常量分配内存,而是直接将const添加到符号表,省去了读取和写入内存的操作,效率更高
MOHAMAD书学习, D1Q2代码案例,迁移过程双向的