剑指offer题解
剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 int findRepeatNumber(vector<int>& nums) { 4 int a[100000] = {0}; 5 for(int i=0;i){ 6 if(a[nums[i]] == 1) 7 return nums[i]; 8 a[nums[i]] = 1; 9 } 10 return 0; 11 } 12 };
剑指 Offer 04. 二维数组中的查找 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 bool ans = false; 4 void f(vectorint>>& matrix,vector int>>& vis,int target,int x,int y){ 5 if(x>=matrix.size()||y>=matrix[0].size()) 6 return ; 7 if(vis[x][y]) 8 return ; 9 vis[x][y] = 1; 10 if(target == matrix[x][y]){ 11 ans = true; 12 return ; 13 } 14 if(x+1 < matrix.size()&&target >= matrix[x+1][y]&&vis[x+1][y] == 0) 15 f(matrix,vis,target,x+1,y); 16 if(y+1 < matrix[0].size()&&target >= matrix[x][y+1]&& vis[x][y+1] == 0) 17 f(matrix,vis,target,x,y+1); 18 } 19 bool findNumberIn2DArray(vector int>>& matrix, int target) { 20 if(matrix.size() == 0) 21 return ans; 22 vector int>> vis(matrix.size(),vector<int>(matrix[0].size(),0)); 23 f(matrix,vis,target,0,0); 24 return ans; 25 } 26 };
剑指 Offer 05. 替换空格 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 string replaceSpace(string s) { 4 string ans = ""; 5 for(int i=0;i){ 6 if(s[i]!=' ') 7 ans+=s[i]; 8 else 9 ans+="%20"; 10 } 11 return ans; 12 } 13 };
剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 vector<int> reversePrint(ListNode* head) { 4 ListNode* pre = nullptr,*cur = head; 5 while(cur){ 6 ListNode *t = cur->next; 7 cur->next = pre; 8 pre = cur; 9 cur = t; 10 } 11 vector<int> ans; 12 while(pre){ 13 ans.push_back(pre->val); 14 pre = pre->next; 15 } 16 return ans; 17 } 18 };
剑指 Offer 07. 重建二叉树 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 TreeNode* f(vector<int>& preorder, vector<int>& inorder,int leftp,int rightp,int lefti,int righti){ 4 if(leftp>rightp||lefti>righti) 5 return nullptr; 6 TreeNode* root = new TreeNode(preorder[leftp]); 7 int mid; 8 for(int i=lefti;i<=righti;i++){ 9 if(inorder[i] == preorder[leftp]){ 10 mid = i; 11 break; 12 } 13 } 14 int leftlen = mid-lefti+1; 15 root->left = f(preorder,inorder,leftp+1,leftp+leftlen-1,lefti,mid-1); 16 root->right = f(preorder,inorder,leftp+leftlen,rightp,mid+1,righti); 17 return root; 18 } 19 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 20 return f(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1); 21 22 } 23 };
剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)
1 class CQueue { 2 public: 3 CQueue() { 4 5 } 6 stack<int> s1,s2; 7 void appendTail(int value) { 8 s1.push(value); 9 } 10 11 int deleteHead() { 12 if(s2.empty()){ 13 while(!s1.empty()){ 14 s2.push(s1.top()); 15 s1.pop(); 16 } 17 18 } 19 if(s2.empty()) 20 return -1; 21 int head = s2.top(); 22 s2.pop(); 23 return head; 24 } 25 };
剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 int fib(int n) { 4 long a = 0,b = 1; 5 if(n==0) 6 return a; 7 while(n>=2){ 8 long c = a+b%1000000007; 9 a = b; 10 b = c; 11 n--; 12 } 13 return b%1000000007; 14 } 15 };
剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 int numWays(int n) { 4 long a = 1,b = 2; 5 if(n==0||n==1) 6 return a; 7 while(n>2){ 8 long c = a+b%1000000007; 9 a = b; 10 b = c; 11 n--; 12 } 13 return b%1000000007; 14 } 15 };
剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode) (leetcode-cn.com)
1 class Solution { 2 public: 3 int minArray(vector<int>& numbers) { 4 int l = 0,r = numbers.size()-1; 5 while(l<r){ 6 int mid =(l+r)/2; 7 if(numbers[mid]>numbers[r]){ 8 l = mid+1; 9 }else if(numbers[mid]<numbers[r]){ 10 r = mid;//细节边界 11 }else{ 12 r--; 13 } 14 } 15 return numbers[l]; 16 } 17 };
剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode) (leetcode-cn.com)
这道题真离谱,多一点点代码都过不了
1 class Solution { 2 public: 3 bool exist(vectorchar>>& board, string word) { 4 rows = board.size(); 5 cols = board[0].size(); 6 for(int i = 0; i < rows; i++) { 7 for(int j = 0; j < cols; j++) { 8 if(dfs(board, word, i, j, 0)) return true; 9 } 10 } 11 return false; 12 } 13 private: 14 int rows, cols; 15 bool dfs(vector char>>& board, string word, int i, int j, int k) { 16 if(i >= rows || i < 0 || j >= cols || j < 0 || board[i][j] != word[k]) return false; 17 if(k == word.size() - 1) return true; 18 board[i][j] = '\0'; 19 bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) || 20 dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1); 21 board[i][j] = word[k]; 22 return res; 23 } 24 };