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;}
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;}