当前位置:   article > 正文

《剑指offer》刷题技巧(c++版)

《剑指offer》刷题技巧(c++版)

剑指 Offer 06. 从尾到头打印链表

使用vector的insert函数,通过头插法插入到数组中

single element (1)
iterator insert (const_iterator position, const value_type& val);
fill (2)
iterator insert (const_iterator position, size_type n, const value_type& val);
range (3)
  1. template <class InputIterator>
  2. iterator insert (const_iterator position, InputIterator first, InputIterator last);
move (4)
iterator insert (const_iterator position, value_type&& val);
initializer list (5)
iterator insert (const_iterator position, initializer_list<value_type> il); 

 

剑指 Offer 07. 重建二叉树

Picture1.png

代码:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
  13. this->preorder=preorder;
  14. for(int i=0;i<inorder.size();i++)
  15. dic[inorder[i]]=i;
  16. return createChild(0,0,inorder.size()-1);
  17. }
  18. private:
  19. vector<int> preorder;
  20. unordered_map<int,int> dic; //存储中序遍历位置
  21. TreeNode* createChild(int root,int left,int right){
  22. if(left>right) return nullptr;
  23. TreeNode * node=new TreeNode(preorder[root]);//建立根节点
  24. int i=dic[preorder[root]];//找到根节点在中序遍历中的位置
  25. node->left=createChild(root+1,left,i-1);
  26. node->right=createChild(root+i-left+1,i+1,right);
  27. return node;
  28. }
  29. };

剑指 Offer 09. 用两个栈实现队列

栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。
双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]A=[1,2,3] 和空栈 B = []B=[]。若循环执行 AA 元素出栈并添加入栈 BB ,直到栈 AA 为空,则 A = []A=[] , B = [3,2,1]B=[3,2,1] ,即 栈 BB 元素实现栈 AA 元素倒序 。
利用栈 BB 删除队首元素: 倒序后,BB 执行出栈则相当于删除了 AA 的栈底元素,即对应队首元素。

Picture0.png

STL中 stack的常用函数:

stack<T> stack;

stack.pop();  stack.push(T t);  stack.empty();

解题代码:

  1. class CQueue {
  2. public:
  3. CQueue() {
  4. }
  5. void appendTail(int value) {
  6. while(!st1.empty()){
  7. //put all of st1 into st2
  8. st2.push(st1.top());
  9. st1.pop();
  10. }
  11. st2.push(value);
  12. while(!st2.empty()){
  13. st1.push(st2.top());
  14. st2.pop();
  15. }
  16. }
  17. int deleteHead() {
  18. if(st1.empty()){
  19. return -1;
  20. }
  21. int temp=st1.top();
  22. st1.pop();
  23. return temp;
  24. }
  25. private:
  26. stack<int> st1;
  27. stack<int> st2;
  28. };
  29. /**
  30. * Your CQueue object will be instantiated and called as such:
  31. * CQueue* obj = new CQueue();
  32. * obj->appendTail(value);
  33. * int param_2 = obj->deleteHead();
  34. */

剑指 Offer 10- I. 斐波那契数列

注意int类型溢出问题

  1. class Solution {
  2. public:
  3. int fib(int n) {
  4. if(n==0) return 0;
  5. if(n==1) return 1;
  6. int a=0,b=1;
  7. for(int i=2;i<=n;i++){
  8. int temp=b;
  9. int sum=(a+b)%1000000007;
  10. a=temp;
  11. b=sum;
  12. }
  13. return b%(1000000007);
  14. }
  15. };

剑指 Offer 10- II. 青蛙跳台阶问题

 与斐波那契数列为题相同,为动态规划问题,只需要把n=0的值改为1即可

  1. class Solution {
  2. public:
  3. int numWays(int n) {
  4. if(n==0) return 1;
  5. if(n==1) return 1;
  6. int a=1,b=1;
  7. for(int i=2;i<=n;i++){
  8. int temp=b;
  9. int sum=(a+b)%1000000007;
  10. a=temp;
  11. b=sum;
  12. }
  13. return b%(1000000007);
  14. }
  15. };

剑指 Offer 11. 旋转数组的最小数字

可以使用二分法来减少运行时间,但是直接遍历也能通过

  1. class Solution {
  2. public:
  3. int minArray(vector<int>& numbers) {
  4. //试试用普通方式
  5. int temp=numbers[0];
  6. for(int i=0;i<numbers.size();i++){
  7. if(numbers[i]<temp)
  8. return numbers[i];
  9. }
  10. return temp;
  11. }
  12. };

 

剑指 Offer 12. 矩阵中的路径

解题思路:
本问题是典型的矩阵搜索问题,可使用 深度优先搜索(DFS)+ 剪枝 解决。

深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成功 的情况(例如:此矩阵元素和目标字符不同、此元素已被访问),则应立即返回,称之为 可行性剪枝 。

Picture0.png

  1. class Solution {
  2. public:
  3. bool exist(vector<vector<char>>& 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<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. };

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/43723
推荐阅读
相关标签
  

闽ICP备14008679号