剑指offer做题记录
1.?劍指 Offer 03. 數組中重復的數字? ?力扣
class Solution { public:int findRepeatNumber(vector<int>& nums) {/* 法一 排序 *//* 法二 哈希表 */map<int, int> mymap;int size = nums.size();mymap[nums[0]] = 0; for(int i= 1; i < size; ++i) {if (mymap.find(nums[i]) == mymap.end()) {mymap[nums[i]] = i;} else {return nums[i];}}return 0;/* 法3 方法3: 鴿巢原理,因為出現的元素值 < nums.size(); 所以我們可以將見到的元素 放到索引的位置,如果交換時,發現索引處已存在該元素,則重復 O(N) 空間O(1) */for(int i=0;i<nums.size();i++){while(nums[i]!=i){if(nums[nums[i]] == nums[i]) return nums[i];int tmp = nums[i];nums[i] = nums[tmp];nums[tmp] = tmp;}}return -1;} };2.?劍指 Offer 04. 二維數組中的查找? ?力扣
class Solution { public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {int rows = matrix.size();if (rows == 0) {return false;}int cols = matrix[0].size();if (cols == 0) {return false;}int row = 0;int col = cols - 1;while(row < rows && col >= 0) {if (matrix[row][col] == target) {return true;}else if (matrix[row][col] < target) {row++;}//這里必須加else if 否則上面row++后會越界else if (matrix[row][col] > target) {col--;}}return false;} };3.?劍指 Offer 05. 替換空格??力扣
class Solution { public:string replaceSpace(string s) {int len = s.size();string res;if (len == 0 || len > 10000) {return res;}int cur = 0;while(cur < len) {string tmp = "";while(cur < len && s[cur] != ' ') {tmp += s[cur];cur++;}res += tmp;if (s[cur] == ' ') {res += "%20";}cur++;}return res;} };4.?劍指 Offer 06. 從尾到頭打印鏈表??力扣
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:void dfs(ListNode* head, vector<int>& res) {if (!head) {return;}dfs(head -> next, res);if (head) {res.push_back(head -> val);}}vector<int> reversePrint(ListNode* head) {//法一:棧//法二:遞歸vector<int> res;dfs(head, res);return res;} };5.?劍指 Offer 09. 用兩個棧實現隊列? ?力扣
兩個棧,一個棧負責進入,一個棧負責出 當有元素進入,第一個棧后面加入 當有元素出隊列時候,三種情況 1.兩個棧都是空,則證明是空隊列 2.第一個棧有元素,第二個棧沒有元素,把第一棧的元素全部出棧放入第二個棧,第二個棧出棧 3.第二個棧還有元素,第二個棧出棧 class CQueue { public:stack<int> sta1;stack<int> sta2;CQueue() {}void appendTail(int value) {sta1.push(value);}int deleteHead() {if (sta1.empty() && sta2.empty()) {return -1;}if (!sta2.empty()) {int top = sta2.top();sta2.pop();return top;} else {while(!sta1.empty()) {sta2.push(sta1.top());sta1.pop();}int top = sta2.top();sta2.pop();return top;}return -1;} };/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/6.?劍指 Offer 13. 機器人的運動范圍? ?力扣
class Solution { public:/* 注意下這題dfs上下左右后,用不用把visit[i][j]再賦false */int CountSum(int m, int n) {int sum = 0;while(m > 0) {sum += m % 10;m /= 10;}while(n > 0) {sum += n % 10;n /= 10;}return sum;}int dfs(int i, int j, int m, int n, vector<vector<bool>>& visit, int k) {if (i < 0 || j < 0 || i >= m || j >= n || visit[i][j] == true || CountSum(i, j) > k ) {return 0;}visit[i][j] = true;return 1 + dfs(i + 1, j, m, n, visit, k) + dfs(i - 1, j, m, n, visit, k) + dfs(i, j + 1, m, n, visit, k) + dfs(i, j - 1, m, n, visit, k);}int movingCount(int m, int n, int k) {vector<vector<bool>> visit(m, vector<bool>(n, false));return dfs(0, 0, m, n, visit, k);} };7.??劍指 Offer 15. 二進制中1的個數??力扣
class Solution { public:int hammingWeight(uint32_t n) {//n&(-n)得到n的最后一位的1//n&(n-1) 去除 n 的位級表示中最低的那一位 1//位運算理論https://www.cnblogs.com/nobita/p/14320239.htmlint count = 0;while(n) {n = n & (n - 1);count++;}return count;} };8.?劍指 Offer 16. 數值的整數次方?力扣
class Solution { public://如果n是奇數,x的n/2次方乘以x的n/2次方乘以x//若n是偶數,x的n/2次方乘以x的n/2次方//若n是負數怎么辦/* -2.00000 -2147483648會出錯,原因是-2147483648超出int范圍,可以直接在原題的函數參數double myPow(double x, int n)里的int n 改成long n 因為用例里哪怕是int類型支持轉成long類型*/double myPow(double x, long n/* 題原本是int n */) {if (n == 0) {return 1.0;}if (n == 1) {return x;}if (x == 1.00) {return x;}if (n < 0) {x = 1/x;n = -n;}double res = 1.0;double tmp = myPow(x, abs(n) >> 1);if (abs(n) % 2 == 1) {res = tmp * tmp * x;} else {res = tmp * tmp;}if (n > 0) {return res;} else {return 1.0 / res;}return res;} };9.?劍指 Offer 21. 調整數組順序使奇數位于偶數前面??力扣
class Solution { public:vector<int> exchange(vector<int>& nums) {int len = nums.size();if (len == 0) {return nums;}int left = 0;int right = len - 1;while(left <= right) {while(left < len && nums[left] % 2 == 1) {left++;}while(right >= 0 && nums[right] % 2 == 0) {right--;}if (left <= right) {swap(nums[left], nums[right]);left++;right--;}}return nums;} };10.??劍指 Offer 26. 樹的子結構??力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:bool compareTwoTrees(TreeNode* A, TreeNode* B) {if (B == nullptr) {return true;}if (A == nullptr) { /*if (A == nullptr && B != nullptr)*/return false;}if (A -> val != B -> val) {return false;}return compareTwoTrees(A -> left, B -> left) && compareTwoTrees(A -> right, B -> right);}bool isSubStructure(TreeNode* A, TreeNode* B) {if (B == nullptr) {return false;}if (A == nullptr) {return false;}return isSubStructure(A -> left, B) || isSubStructure(A -> right, B) || compareTwoTrees(A, B);} };11. 反轉鏈表力扣
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode* reverseList(ListNode* head) {/* if (head == nullptr || head -> next == nullptr) {return head;}ListNode* pre = nullptr;ListNode* cur = head;ListNode* tmp_next = nullptr;while(cur) {tmp_next = cur -> next;cur -> next = pre;pre = cur;cur = tmp_next;}return pre; */if (head == nullptr || head -> next == nullptr) {return head;}ListNode* tmp = reverseList(head -> next);head -> next -> next = head;head -> next = nullptr;return tmp;} };12?劍指 Offer 27. 二叉樹的鏡像??力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:void dfs(TreeNode* &root) {if (!root || (root -> left == nullptr && root -> right == nullptr)) {return;}TreeNode* tmp = root -> left;root -> left = root -> right;root -> right = tmp;dfs(root -> left);dfs(root -> right);}TreeNode* mirrorTree(TreeNode* root) {dfs(root);return root;} };13??劍指 Offer 28. 對稱的二叉樹??力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:bool dfs(TreeNode* node1, TreeNode* node2) {if (node1 == nullptr && node2 == nullptr) {return true;}if (node1 == nullptr || node2 == nullptr) {return false;}if (node1 -> val != node2 -> val) {return false;}return dfs(node1 -> left, node2 -> right) && dfs(node1 -> right, node2 -> left);}bool isSymmetric(TreeNode* root) {if (!root) {return true;}return dfs(root -> left, root -> right);} };14??劍指 Offer 30. 包含min函數的棧? ?力扣
class MinStack { public:/** initialize your data structure here. */stack<int> res;stack<int> store;MinStack() {}void push(int x) {res.push(x);if (store.empty() || store.top() > x) {store.push(x);} else {store.push(store.top());}}void pop() {res.pop();store.pop();}int top() {return res.top();}int min() {return store.top();} };/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->min();*/15??劍指 Offer 31. 棧的壓入、彈出序列??力扣
class Solution { public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {int size1 = pushed.size();int size2 = popped.size();stack<int> sta;if (size1 != size2) {return false;}if (size1 == 0 && size2 == 0) {return true;}int i = 0;int j = 0;for (; i < size1; ++i) {sta.push(pushed[i]);while(sta.size() != 0 && sta.top() == popped[j]) {sta.pop();j++;}}return sta.empty();} };16? ?
劍指 Offer 34. 二叉樹中和為某一值的路徑? ?力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:void dfs(TreeNode* root, int sum, int target, vector<int> vec, vector<vector<int>>& res) {if (!root) {return;}sum += root -> val;vec.push_back(root -> val);if (target == sum && root -> left == nullptr && root -> right == nullptr) {res.push_back(vec);}dfs(root -> left, sum, target, vec, res);dfs(root -> right, sum, target, vec, res);vec.pop_back();sum -= root -> val;}vector<vector<int>> pathSum(TreeNode* root, int target) {int sum = 0;vector<vector<int>> res;vector<int> vec;dfs(root, sum, target, vec, res);return res;} };17?劍指 Offer 35. 復雜鏈表的復制? ?力扣
/* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;} }; */ class Solution { public:Node* copyRandomList(Node* head) {if(head == nullptr) return nullptr;Node* cur = head;unordered_map<Node*, Node*> map;// 3. 復制各節點,并建立 “原節點 -> 新節點” 的 Map 映射while(cur != nullptr) {map[cur] = new Node(cur->val);cur = cur->next;}cur = head;// 4. 構建新鏈表的 next 和 random 指向while(cur != nullptr) {map[cur]->next = map[cur->next];map[cur]->random = map[cur->random];cur = cur->next;}// 5. 返回新鏈表的頭節點return map[head];} };18??劍指 Offer 38. 字符串的排列??力扣
(1)set去重
class Solution { public:void dfs(string s, int i, int len, set<string>& mySet, string tmpStr, vector<bool>& visit) {if (i == len) {mySet.insert(tmpStr);return;}for(int j = 0; j < len; ++j) {if (visit[j] == false) {tmpStr += s[j];visit[j] = true;dfs(s, i + 1, len, mySet, tmpStr, visit);visit[j] = false;tmpStr.pop_back();}}}vector<string> permutation(string s) {set<string> mySet;string tmpStr;int len = s.size();vector<bool> visit(len, false);vector<string> res;dfs(s, 0, len, mySet, tmpStr, visit);set<string>::iterator iter = mySet.begin();for(; iter != mySet.end(); ++iter) {res.push_back(*iter);}return res;} };19?劍指 Offer 40. 最小的k個數? ?力扣
class Solution { public:vector<int> getLeastNumbers(vector<int>& arr, int k) {priority_queue<int, vector<int>, less<int>> buffer;vector<int> res;int len = arr.size();if (len == 0 || k == 0) {return res;}for(int i = 0; i < len; ++i) {if (i < k) {buffer.push(arr[i]);} else {if (arr[i] < buffer.top()) {buffer.pop();buffer.push(arr[i]);}}}while(buffer.size()!= 0) {res.push_back(buffer.top());buffer.pop();}return res;} };20??劍指 Offer 45. 把數組排成最小的數??力扣
class Solution { public:string minNumber(vector<int>& nums) {vector<string> strs;string res;for(auto num:nums)strs.push_back(to_string(num));sort(strs.begin(),strs.end(),compare);for(auto str:strs)res+=str;return res;} private:static bool compare(const string &a,const string &b){return a+b<b+a;} };21??劍指 Offer 47. 禮物的最大價值??力扣
class Solution { public:int maxValue(vector<vector<int>>& grid) {int rows = grid.size();if (rows == 0) {return 0;}int cols = grid[0].size();vector<vector<int>> vec(rows, vector<int>(cols, 0));vec[0][0] = grid[0][0];for(int i = 1; i < rows; ++i) {vec[i][0] = vec[i - 1][0] + grid[i][0];}for(int i = 1; i < cols; ++i) {vec[0][i] = vec[0][i - 1] + grid[0][i];}for(int i = 1; i < rows; ++i) {for(int j = 1; j < cols; ++j) {vec[i][j] = grid[i][j] + max(vec[i - 1][j], vec[i][j - 1]);}}return vec[rows - 1][cols - 1]; } };22?劍指 Offer 48. 最長不含重復字符的子字符串?力扣
class Solution { public:int lengthOfLongestSubstring(string s) {/* 滑動窗口int len = s.size();if (len == 0 || len == 1) {return len;}int left = 0, right = left + 1;unordered_set<char> mySet;int resLen = 1;int tmplen = 1;mySet.insert(s[left]);while(right < len) {while(left < right && mySet.find(s[right]) != mySet.end()) {mySet.erase(s[left]);left++;}mySet.insert(s[right]);resLen = max(resLen, right - left + 1);right++;}return resLen; *//* 動態規劃 */int size = s.size();if (size == 0 || size == 1) {return size;}map<char, int> myMap;vector<int> dp(size, -1);dp[0] = 1;for(int i = 0; i < size; ++i) {myMap[s[i]] = -1;}myMap[s[0]] = 0;for(int i = 1; i < size; ++i) {if (i - myMap[s[i]] > dp[i - 1]) {dp[i] = dp[i - 1] + 1;} else {dp[i] = i - myMap[s[i]];}myMap[s[i]] = i;}int max = -1;for(int i = 0; i < size; ++i) {if (dp[i] > max) {max = dp[i];}}return max;} };23?劍指 Offer 54. 二叉搜索樹的第k大節點??力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:void dfs(TreeNode* root, vector<int>& vec) {if (!root) {return;}dfs(root -> left, vec);vec.push_back(root -> val);dfs(root -> right, vec);}int kthLargest(TreeNode* root, int k) {if (!root) {return 0;}vector<int> vec;dfs(root, vec);int index = vec.size() - k;return vec[index];} };24?劍指 Offer 61. 撲克牌中的順子??力扣
class Solution { public:bool isStraight(vector<int>& nums) {sort(nums.begin(), nums.end());int count = 0;int wang = 0;for(int i = 0; i < 4; ++i) {if (nums[i] == 0) {wang++;}if (nums[i] == nums[i+ 1] && nums[i] != 0) {return false;} if (nums[i + 1] > nums[i] && nums[i] != 0) {count += (nums[i + 1] - nums[i] - 1);}}if (wang >= count) {return true;}return false;} };25?劍指 Offer 63. 股票的最大利潤?劍指 Offer 63. 股票的最大利潤 - 力扣(LeetCode) (leetcode-cn.com)
class Solution { public:int maxProfit(vector<int>& prices) {//如果prices[i]大于min,則去更新一下利潤res//否則說明當前的prices[i]比min還小,則更新minint size = prices.size();if (size == 0) {return 0;}int min = prices[0];int optimum = 0;for (int i = 1; i < size; ++i) {if (prices[i] <= min) {min = prices[i];} else if (prices[i] > min) {optimum = max(prices[i] - min, optimum);}}return optimum;} };26?劍指 Offer 32 - III. 從上到下打印二叉樹 III? ?力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) {return res;}queue<TreeNode*> qu;vector<int> tmpVec;qu.push(root);bool flag = false;while(!qu.empty()) {int size = qu.size();for (int i = 0; i < size; ++i) {TreeNode* tmpNode = qu.front();qu.pop();tmpVec.push_back(tmpNode -> val);if (tmpNode -> left) {qu.push(tmpNode -> left);}if (tmpNode -> right) {qu.push(tmpNode -> right);}}flag = !flag;if (flag == true) {res.push_back(tmpVec);} else {reverse(tmpVec.begin(), tmpVec.end());res.push_back(tmpVec);}tmpVec.clear();}return res;} };27??劍指 Offer 32 - II. 從上到下打印二叉樹 II? ?力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) {return res;}queue<TreeNode*> qu;vector<int> tmpVec;qu.push(root);bool flag = false;while(!qu.empty()) {int size = qu.size();for (int i = 0; i < size; ++i) {TreeNode* tmpNode = qu.front();qu.pop();tmpVec.push_back(tmpNode -> val);if (tmpNode -> left) {qu.push(tmpNode -> left);}if (tmpNode -> right) {qu.push(tmpNode -> right);}}flag = !flag;if (flag == true) {res.push_back(tmpVec);} else {reverse(tmpVec.begin(), tmpVec.end());res.push_back(tmpVec);}tmpVec.clear();}return res;} };28?劍指 Offer 56 - I. 數組中數字出現的次數??力扣
看下這兩個帖子基礎知識?https://blog.csdn.net/qq_19018277/article/details/103812534?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.essearch_pc_relevant
leetcode算法總結 —— 位運算_Charles Ren's Tech Blog-CSDN博客
class Solution { public:vector<int> singleNumbers(vector<int>& nums) {int two = 2;int size = nums.size();vector<int> part1;vector<int> part2;vector<int> res;int x = 0;for (int i = 0; i < size; ++i) {x = x ^ nums[i];}//從右向左找第一個1,記錄這個1的位置,說明兩個單數該位不同,再依據這位不同將數組分成兩組,則兩個單數一定分別在兩組,兩組各自抑或,找到各自的單數// 獲取一個數二進制最低位的1int y = x & (-x);for (int i = 0; i < size; ++i) {int w = nums[i] & y;if (w == y) {part1.push_back(nums[i]);} else {part2.push_back(nums[i]);}}int z = 0;for (int i = 0; i < part1.size(); ++i) {z= z^ part1[i];}res.push_back(z);int m = 0;for (int i = 0; i < part2.size(); ++i) {m= m^ part2[i];}res.push_back(m);return res;} };29??劍指 Offer II 073. 狒狒吃香蕉??力扣
class Solution { public:int times(int index, int speed, vector<int>& piles) {if (piles[index] % speed != 0) {return piles[index] / speed + 1; } else {return piles[index] / speed;}}int minEatingSpeed(vector<int>& piles, int h) {sort(piles.begin(), piles.end());int size = piles.size();int right = piles[size - 1];double sum = 0;int left = 1;int res = right;while (left <= right) {int mid = (left + right) / 2;int tmpsum = 0;for (int i = 0; i < size; ++i) {tmpsum += times(i, mid, piles);}if (tmpsum > h) {left = mid + 1;} else {if (mid < res) {res = mid;}right = mid - 1;}}return res;} };30?劍指 Offer 56 - II. 數組中數字出現的次數 II? ?力扣
class Solution { public:int singleNumber(vector<int>& nums) {/* 如果把所有的出現三次的數字的二進制表示的每一位都分別加起來,那么每一位都能被3整除。 我們把數組中所有的數字的二進制表示的每一位都加起來。如果某一位能被3整除,那么這一位對只出現一次的那個數的這一肯定為0。如果某一位不能被3整除,那么只出現一次的那個數字的該位置一定為1. */vector<int> vec(32, 0);int sum = 0;int size = nums.size(); for (int i = 0; i < size; ++i) {for (int j = 0; j < 32; ++j) {vec[j] += nums[i] & 1;nums[i] = (nums[i] >> 1);}}for (int i = 0; i < 32; ++i) {if (vec[i] % 3 == 1) {sum += pow(2, i);}}return sum;} }31??劍指 Offer 57 - II. 和為s的連續正數序列??力扣
class Solution { public:vector<vector<int>> findContinuousSequence(int target) {vector<vector<int>> res;if (target == 1) {return res;}int left = 1, right = left + 1;vector<int> tmpvec;while (right <= target / 2 + 1 && left <= right) {int tmpSum = 0;for (int i = left; i <= right; i ++) {tmpSum += i;}if (tmpSum < target) {right++;tmpSum += right;}else if (tmpSum > target) {left++;tmpSum -= left;}else if (tmpSum == target) {for (int m = left; m <= right; ++m) {tmpvec.push_back(m);}res.push_back(tmpvec);tmpvec.clear();left++;right++;}}return res;} };32?劍指 Offer 58 - I. 翻轉單詞順序??力扣
class Solution { public:string reverseWords(string s) {stack<string> sta;int len = s.length();if (len == 0) {return s;}int i = 0;string tmpstr = "";while (i < len) {while (i < len && s[i] == ' ') {++i;}while (i < len && s[i] != ' ') {tmpstr += s[i];++i;}sta.push(tmpstr);tmpstr = "";}string res;while(!sta.empty()) {res += sta.top();sta.pop();res += " ";int l = res.size();if (sta.empty()) {if (res[l - 1] == ' ') {res = res.substr(0, l - 1);}}}int j = 0;int x = res.size();while (j < x && res[j] == ' ') {j++;}return res.substr(j, x - j);} };33?劍指 Offer 59 - II. 隊列的最大值?力扣
class MaxQueue { public:queue<int> qu;deque<int> deq;MaxQueue() {}int max_value() {if (qu.empty() || deq.empty()) {return -1;}return deq.front();}void push_back(int value) {qu.push(value);while (!deq.empty() && value > deq.back()) {deq.pop_back();}deq.push_back(value);}int pop_front() {if (qu.empty()) {return -1;}int tmp = qu.front();qu.pop();if (!deq.empty() && deq.front() == tmp) {deq.pop_front();}return tmp;} };?34?劍指 Offer II 002. 二進制加法??力扣
class Solution { public:string addBinary(string a, string b) {int lena = a.size();int lenb = b.size();int carry = 0;string res = "";if (lena > lenb) {string tmp = string(lena - lenb, '0');tmp += b;b = tmp;} else if (lena < lenb) {string tmp = string(lenb - lena, '0');tmp += a;a = tmp;}int cur = b.size() - 1;while (cur >= 0) {if ((a[cur] - '0') + (b[cur] - '0') + carry == 0) {res += "0";carry = 0;}else if ((a[cur] - '0') + (b[cur] - '0') + carry == 1) {res += "1";carry = 0;}else if ((a[cur] - '0') + (b[cur] - '0') + carry == 2) {res += "0";carry = 1;}else if ((a[cur] - '0') + (b[cur] - '0') + carry == 3) {res += "1";carry = 1;}cur--;}if (carry == 1) {res += "1";}reverse(res.begin(), res.end());return res;} };35?劍指 Offer II 003. 前 n 個數字二進制中 1 的個數?
力扣
36?劍指 Offer II 005. 單詞長度的最大乘積
class Solution { public:int maxProduct(vector<string>& words) {int size = words.size();vector<int> tmp(26, 0);//num為向量行數,0為初始化值vector<vector<int>> vec(size, tmp);for (int i = 0; i < size; ++i) {for (int j = 0; j < words[i].size(); ++j) {vec[i][words[i][j] - 'a']++;}}int ret = 0;int k, i, j;for (i = 0; i < size; ++i) {for (j = i + 1; j < size; ++j) {for (k = 0; k < 26; ++k) {if (vec[i][k] != 0 && vec[j][k] != 0) {break;}}if (k == 26) {if (words[i].size() * words[j].size() > ret) {ret = words[i].size() * words[j].size();}}}}return ret;} };37??劍指 Offer II 007. 數組中和為 0 的三個數??力扣
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {int len = nums.size();set<vector<int>> res;sort(nums.begin(), nums.end());int i = 0;for(; i < len-2; i++) {int j = i;if (nums[i] > 0) {break;}while(nums[i] == nums[i+1] && i < len-2) i++;int num = nums[j];int target = -num;int l = j+1, r = len-1;while(l < r) {int temp = nums[l] + nums[r];if(temp == target) {res.insert({num, nums[l], nums[r]});while(l + 1 < len && nums[l] == nums[l + 1]) {l++;}while(r > l && nums[r] == nums[r-1]) {r--;}l++,r--;} else if(temp > target) {r--;} else {l++;}}}vector<vector<int>> ans;ans.assign(res.begin(), res.end());return ans;} };38?劍指 Offer II 009. 乘積小于 K 的子數組? ?
力扣
39??劍指 Offer II 010. 和為 k 的子數組??
力扣
40?劍指 Offer II 011. 0 和 1 個數相同的子數組? ?
力扣
41?劍指 Offer II 013. 二維子矩陣的和? ?力扣
class NumMatrix { public:vector<vector<int>> vec;NumMatrix(vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();vec.resize(rows + 1, vector<int>(cols + 1, 0)); // rows和cols都加一是為了在sumRegion里少if,否則可以看下注釋里if很多for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {vec[i + 1][j + 1] = vec[i + 1][j] - vec[i][j] + matrix[i][j] + vec[i][j + 1];}}}int sumRegion(int row1, int col1, int row2, int col2) {//if (row1 > 0 && col1 > 0) {return vec[row2 + 1][col2 + 1] - vec[row1][col2 + 1] - vec[row2 + 1][col1] + vec[row1][col1]; //return vec[row2][col2] - vec[row1 - 1][col2] - vec[row2][col1 - 1] + vec[row1 - 1][col1 - 1]; /* } else if (row1 == 0 && col1 == 0) {return vec[0][0]; }else if (col1 == 0) {return vec[row2][col2] - vec[row1-1][col2];} else if (row1 == 0) {return vec[row2][col2] - vec[row2][col1 - 1];} return -1; */} };? ?42? ?劍指 Offer II 012. 左右兩邊子數組的和相等??
力扣
43?劍指 Offer II 041. 滑動窗口的平均值? ??
力扣
44?劍指 Offer II 016. 不含重復字符的最長子字符串? ?力扣
class Solution { public:int lengthOfLongestSubstring(string s) {int size = s.size();int left = 0;int right = 0;unordered_map<char, int> mp;int len = 0;int ret = 0;for (int i = 0; i < size; ++i) {mp[s[i]]++;while (left <= i && mp[s[i]] > 1) {mp[s[left]]--;left++;}ret = max (ret, i - left + 1);}return ret;} };45?劍指 Offer II 018. 有效的回文??力扣劍指 Offer II 018. 有效的回文??
class Solution { public:bool isPalindrome(string s) {int i = 0;int j = s.size() - 1;while (i < j) {if (!isalnum(s[i])) {i++;}else if (!isalnum(s[j])) {j--;}else {if (tolower(s[i]) != tolower(s[j])) {return false;}else {i++;j--;}} }return true;} };/* isalpha :判斷一個字符是否為字母,如果是則返回true,否則返回false; isdigit : 判斷一個字符是否表示數字,如果是則返回true,否則返回false; isalnum : 判斷一個字符是否表示數字或者字母,如果是則返回true,否則返回false; islower : 判斷一個字符是否為小寫字母,如果是則返回true,否則返回false; isupper : 判斷一個字符是否為大寫字母,如果是則返回true,否則返回false; tolower : 若字符為字母則轉化為小寫字母; toupper : 若字符為字母則轉化為大寫字母;46?劍指 Offer II 021. 刪除鏈表的倒數第 n 個結點??
力扣
47劍指 Offer II 022. 鏈表中環的入口節點?
力扣
??
力扣
48?劍指 Offer II 024. 反轉鏈表? ?
力扣
49?劍指 Offer II 026. 重排鏈表? ? ??
力扣
50??劍指 Offer II 027. 回文鏈表??
力扣
51?劍指 Offer II 028. 展平多級雙向鏈表? ?
力扣
52?劍指 Offer II 030. 插入、刪除和隨機訪問都是 O(1) 的容器
??????力扣
生產隨機數?如何在C++中產生隨機數 - Eventide - 博客園
class RandomizedSet { public:map<int, int> mymap;vector<int> vec;RandomizedSet() {}bool insert(int val) {if (mymap.count(val) != 0) {return false;}vec.push_back(val);mymap[val] = vec.size() - 1;return true;}bool remove(int val) {if (mymap.count(val) == 0) {return false;}int loc = mymap[val];vec[loc] = vec[vec.size() - 1];mymap[vec[vec.size() - 1]] = loc;vec.pop_back();mymap.erase(val);return true;}int getRandom() {return vec[rand() % vec.size()];} }; /*** Your RandomizedSet object will be instantiated and called as such:* RandomizedSet* obj = new RandomizedSet();* bool param_1 = obj->insert(val);* bool param_2 = obj->remove(val);* int param_3 = obj->getRandom();*/53?劍指 Offer II 076. 數組中的第 k 大的數字??劍指 Offer II 076. 數組中的第 k 大的數字 - 力扣(LeetCode) (leetcode-cn.com)
class Solution { public:// less<int> top是最大// greater<int> top是最大// pair以及優先隊列中用pair https://blog.csdn.net/hnjzsyjyj/article/details/108929993int findKthLargest(vector<int>& nums, int k) {priority_queue<int, vector<int>, greater<int>> vec; // top是最小的int size = nums.size();for (int i = 0; i < size; ++i) {if (i < k) {vec.push(nums[i]);} else {if (vec.top() < nums[i]) {vec.pop();vec.push(nums[i]);}}}return vec.top();} };/*vector中的元素是pair,如何對vector進行排序,排序原則是pair的first或者second#include<cmath> #include<algorithm> #include <vector> #define mem(x,y) memset(x,y,sizeof(x)) using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; pair<int, int> p; vector<pair<int, int>> vec; int cmp(pair<int, int>a, pair<int, int>b){if (a.first != b.first)return a.first>b.first;else return a.second<b.second; } int main(){int a, b;p = make_pair(1, 2);vec.push_back(p);p = make_pair(3, 4);vec.push_back(p);p = make_pair(5, 6);vec.push_back(p);sort(vec.begin(), vec.end(), cmp);cout << vec.size() << endl;for (int i = 0; i < vec.size(); ++i) {cout << vec[i].first << " " << vec[i].second << endl;}return 0; } *//* #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef struct example {int elem1;int elem2; }example;/*這個comparison函數很重要.如果希望升序排序,就是"<",降序排列就是">"號,這樣便于直觀記憶.如果希望用elem2作為比較標準 就把elem1改為elem2,這樣結構體就以elem2為比較標準排序了.*/ bool comparison(example a,example b){return a.elem1<b.elem1; } int main() {int N;fin>>N;vector<example> array(N);for(int i=0;i<N;i++){fin>>array[i].elem1>>array[i].elem2;}sort(array.begin(),array.end(),comparison);for(int i=0;i<N;i++){cout<<array[i].elem1<<" "<<array[i].elem2<<endl;}return 0;*/54?劍指 Offer II 033. 變位詞組??
力扣
55?劍指 Offer II 068. 查找插入位置??
力扣
56?劍指 Offer II 081. 允許重復選擇元素的組合? ?
力扣
57??劍指 Offer II 082. 含有重復元素集合的組合? ?力扣
class Solution { public:vector<int> tmpVec;vector<vector<int>> res;int i = 0;set<vector<int>> myset;void dfs(int i, int target, int sum, vector<int>& candidates) {if (sum == target) {res.push_back(tmpVec);}if (sum < target) {for (; i < candidates.size(); ++i) {tmpVec.push_back(candidates[i]);sum += candidates[i];dfs(i + 1, target, sum, candidates);tmpVec.pop_back();sum -= candidates[i];}}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {dfs(0, target, 0, candidates);for (int i = 0; i < res.size(); ++i) {sort(res[i].begin(), res[i].end());myset.insert(res[i]);}vector<vector<int>> res2;set<vector<int>, int>::iterator iter = myset.begin();for (; iter != myset.end(); ++iter) {res2.push_back(*iter);}return res2;} };58?劍指 Offer II 083. 沒有重復元素集合的全排列? ??
力扣
59??劍指 Offer II 069. 山峰數組的頂部? ?
力扣
60??劍指 Offer II 035. 最小時間差? ??
力扣
61??劍指 Offer II 038. 每日溫度??
力扣
62?劍指 Offer II 036. 后綴表達式? ?
力扣
63 劍指 Offer II 037. 小行星碰撞?
力扣
64?劍指 Offer II 049. 從根節點到葉節點的路徑數字之和??
力扣
65?劍指 Offer II 105. 島嶼的最大面積? 力扣
class Solution { public:int dfs(vector<vector<int>>& grid, int rows, int cols, int row, int col) {if (row < 0 || col < 0 || row >= rows || col >= cols || grid[row][col] == 0) {return 0;}grid[row][col] = 0;return 1 + dfs(grid, rows, cols, row + 1, col) + dfs(grid, rows, cols, row, col + 1) + dfs(grid, rows, cols, row - 1, col) + dfs(grid, rows, cols, row, col - 1);}int maxAreaOfIsland(vector<vector<int>>& grid) {int rows = grid.size();int cols = grid[0].size();int tmpMax = -1;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; ++j) {int t = dfs(grid, rows, cols, i, j);if (tmpMax < t) {tmpMax = t;}}}return tmpMax;} };66?劍指 Offer II 058. 日程表? ?
力扣
67?劍指 Offer II 045. 二叉樹最底層最左邊的值? ?
力扣
68?劍指 Offer II 089. 房屋偷盜? ??
力扣
69?劍指 Offer II 099. 最小路徑之和?
力扣
70?劍指 Offer II 100. 三角形中最小路徑之和? ??
class Solution { public:int minimumTotal(vector<vector<int>>& triangle) {int rows = triangle.size();int cols = triangle[rows - 1].size();vector<vector<int>> vec(rows, vector<int>(cols, 0)) ;vec[0][0] = triangle[0][0];for (int i = 1; i < rows; ++i) {vec[i][0] = vec[i - 1][0] + triangle[i][0];}for (int i = 1; i < rows; ++i) {for (int j = 1; j < i + 1; ++j) {vec[i][j] = min(vec[i - 1][j - 1], vec[i - 1][j]) + triangle[i][j];}vec[i][i] = vec[i - 1][i - 1] + triangle[i][i];}int res = INT_MAX;for (int i = 0; i < cols; ++i) {if (vec[rows - 1][i] < res) {res = vec[rows - 1][i];}}return res;} };71??劍指 Offer II 101. 分割等和子集??
力扣
72??劍指 Offer II 091. 粉刷房子? ??
力扣
73?劍指 Offer II 095. 最長公共子序列? ?
力扣
74?劍指 Offer II 102. 加減的目標值? ?
力扣
75??劍指 Offer II 098. 路徑的數目? ??
力扣
?76??劍指 Offer II 053. 二叉搜索樹中的中序后繼??
力扣
77??劍指 Offer II 075. 數組相對排序? ??
力扣
78??劍指 Offer II 052. 展平二叉搜索樹?力扣
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:vector<int> vec;void MidOrder(TreeNode* root) {if (!root) {return;}MidOrder(root -> left);vec.push_back(root -> val);MidOrder(root -> right);}TreeNode* increasingBST(TreeNode* root) {MidOrder(root);int size = vec.size();TreeNode* res = new TreeNode(0);TreeNode* tmp = res;for (int i = 0; i < size; ++i) {TreeNode* node = new TreeNode(vec[i]);node -> left = nullptr;tmp -> right = node;tmp = node;}return res -> right;} };79?劍指 Offer II 110. 所有路徑? ?
力扣
80?劍指 Offer II 059. 數據流的第 K 大數值?
力扣
總結
以上是生活随笔為你收集整理的剑指offer做题记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EF实现模糊查询
- 下一篇: 字节跳动的产品经理是怎么工作的?