vector<vector<int>> result;
vector<int> path;voidbacktracking(int n,int k,int startIndex){if(path.size()== k){
result.push_back(path);return;}for(int i = startIndex; i <= n; i++){
path.push_back(i);backtracking(n, k, i +1);
path.pop_back();}}
vector<vector<int>>combine(int n,int k){backtracking(n, k,1);return result;}
77.组合(优化)
vector<vector<int>> result;
vector<int> path;voidbacktracking(int n,int k,int startIndex){if(path.size()== k){
result.push_back(path);return;}//进行剪枝的关键在于:列表中的剩余元素(n - i + 1) >= path数组需要存储的剩余数量 (k - path.size()),//进而得到了i <= n - (k - path.size()) + 1;for(int i = startIndex; i <= n -(k - path.size())+1; i++){
path.push_back(i);backtracking(n, k, i +1);
path.pop_back();}}
vector<vector<int>>combine(int n,int k){backtracking(n, k,1);return result;}
2.复习内容
707. 设计链表
classMyLinkedList{public:structLinkedNode{int val;
LinkedNode* next;LinkedNode(int x):val(x),next(nullptr){}};MyLinkedList(){
dummy_Head =newLinkedNode(0);
_size =0;}intget(int index){if(index >(_size -1)|| index <0)return-1;
LinkedNode* cur = dummy_Head -> next;while(index--){
cur = cur -> next;}return cur -> val;}voidaddAtHead(int val){
LinkedNode* node =newLinkedNode(val);
node -> next = dummy_Head -> next;
dummy_Head -> next = node;
_size++;}voidaddAtTail(int val){
LinkedNode* cur = dummy_Head;while(cur -> next){
cur = cur -> next;}
LinkedNode* node =newLinkedNode(val);
cur -> next = node;
_size++;}voidaddAtIndex(int index,int val){if(index > _size)return;if(index <0) index =0;
LinkedNode* cur = dummy_Head;while(index--){
cur = cur -> next;}
LinkedNode* node =newLinkedNode(val);
node -> next = cur -> next;
cur -> next = node;
_size++;}voiddeleteAtIndex(int index){if(index <-1|| index >(_size -1))return;
LinkedNode* cur = dummy_Head;while(index--){
cur = cur -> next;}
LinkedNode* tmp = cur -> next;
cur -> next = cur -> next -> next;delete tmp;
_size--;}private:int _size;
LinkedNode* dummy_Head;};
206. 反转链表
ListNode*reverseList(ListNode* head){
ListNode* pre =nullptr,* cur = head,*tmp =nullptr;while(cur){
tmp = cur -> next;
cur -> next = pre;
pre = cur;
cur = tmp;}return pre;}
2025.5.1
1.学习内容
17. 电话号码的字母组合
const string letterMap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz",};
string path ="";
vector<string> result;voidbacktracking(string digits,int index){if(index == digits.size()){
result.push_back(path);return;}int digit = digits[index]-'0';for(int i =0; i < letterMap[digit].size(); i++){
string letter = letterMap[digit];
path.push_back(letter[i]);backtracking(digits, index +1);
path.pop_back();}}
vector<string>letterCombinations(string digits){
path.clear();
result.clear();if(digits.size()==0)return result;backtracking(digits,0);return result;}
2.复习内容
216.组合总和III
vector<int> path;
vector<vector<int>> result;voidback_tracking(int startIndex,int sum,int n,int k){if(path.size()== k){if(sum == n) result.push_back(path);return;}if(sum >= n)return;//k - path.size() <= 9 - i + 1;for(int i = startIndex; i <=9-(k - path.size())+1; i++){
path.push_back(i);
sum += i;//记住回溯的条件选择:是i+1,而不是startIndex + 1back_tracking(i +1, sum, n, k);
sum -= i;
path.pop_back();}}
vector<vector<int>>combinationSum3(int k,int n){
path.clear();
result.clear();back_tracking(1,0, n, k);return result;}
2025.5.2
1.学习内容
39. 组合总和
vector<int> path;
vector<vector<int>> result;voidbacktracking(vector<int> candidates,int target,int sum,int startIndex){if(sum > target)return;if(sum == target){
result.push_back(path);return;}for(int i = startIndex; i < candidates.size(); i++){
path.push_back(candidates[i]);
sum += candidates[i];//相比于组合,这块应该是i + 1backtracking(candidates, target, sum, i);
sum -= candidates[i];
path.pop_back();}}
vector<vector<int>>combinationSum(vector<int>& candidates,int target){
path.clear();
result.clear();backtracking(candidates, target,0,0);return result;}
vector<int> path;
vector<vector<int>> result;voidbacktracking(vector<int> nums,int startIndex){
result.push_back(path);//这个终止条件可有可无if(startIndex >= nums.size())return;for(int i = startIndex; i < nums.size(); i++){
path.push_back(nums[i]);backtracking(nums, i +1);
path.pop_back();}}
vector<vector<int>>subsets(vector<int>& nums){
path.clear();
result.clear();backtracking(nums,0);return result;}
93. 复原 IP 地址
vector<string> result;boolisValid(string s,int start,int end){if(start > end)returnfalse;if(s[start]=='0'&& start != end)returnfalse;int num =0;for(int i = start; i <= end; i++){if(s[i]<'0'&& s[i]>'9')returnfalse;
num = num *10+(s[i]-'0');if(num >255)returnfalse;}returntrue;}voidbacktracking(string& s,int startIndex,int pointNum){if(pointNum ==3){if(isValid(s, startIndex, s.size()-1)) result.push_back(s);return;}for(int i = startIndex; i < s.size(); i++){if(isValid(s, startIndex, i)){
s.insert(s.begin()+ i +1,'.');
pointNum++;backtracking(s, i +2, pointNum);
pointNum--;
s.erase(s.begin()+ i +1);}}}
vector<string>restoreIpAddresses(string s){
result.clear();backtracking(s,0,0);return result;}
24. 两两交换链表中的节点
ListNode*swapPairs(ListNode* head){
ListNode* dummu_Head =newListNode(0);
dummu_Head -> next = head;
ListNode* cur = dummu_Head;while(cur -> next !=nullptr&& cur -> next -> next !=nullptr){
ListNode* tmp = cur -> next;
ListNode* tmp1 = cur -> next -> next -> next;
cur -> next = cur -> next -> next;
cur -> next -> next = tmp;
cur -> next -> next -> next = tmp1;
cur = tmp;}
head = dummu_Head -> next;return head;}