《剑指offer》JZ1 ~ JZ10

Posted 黑桃️

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指offer》JZ1 ~ JZ10相关的知识,希望对你有一定的参考价值。

《剑指offer》JZ1 ~ JZ10


JZ1:二维数组中的查找

class Solution 
public:
    bool Find(int target, vector<vector<int> > array) 
        if(array.size()==0 || array[0].size()==0) return false;
        // 从右上角开始(也可以从左下角开始,核心在于两个方向包含增减)
        int x=0,y=array[0].size()-1;
        while(x<array.size() && y>=0)
        
            if(target == array[x][y]) return true;
            else if(target > array[x][y]) x++;
            else y--;
        
        return false;
    
;

JZ2:替换空格


过于简单,不宜展示…


JZ3:从尾到头打印链表


先反转链表,再跑一遍取到每个值,纯属为了多写一遍反转链表的代码

关于原地反转链表的博客 (注意有无头节点)

可以直接遍历一遍链表,然后将值放入vector,最后reverse

class Solution 
public:
    vector<int> printListFromTailToHead(ListNode* head) 
        vector<int> ans;
        if(head==NULL) return ans;
        // 反转链表
        ListNode* p = head;
        ListNode* q = NULL;
        ListNode* t;
        while(p)
        
            t = p->next;
            p->next = q;
            q = p;
            p = t;
        
        
        while(q)
        
            ans.push_back(q->val);
            q = q->next;
        
        return ans;
    
;

JZ4:重建二叉树



经典的建树,以前写的博客就很多,静态的也有…

类似1

类似2

class Solution 
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) 
        return create(0, pre.size()-1, 0, vin.size()-1, pre, vin);
    
    
    TreeNode* create(int qz,int qy,int zz,int zy,vector<int> pre,vector<int> vin)
    
        if(qz>qy) return NULL;
        TreeNode* root = new TreeNode(pre[qz]);
        int k=zz;
        for(;k<=zy;k++)
            if(vin[k] == pre[qz]) break;
        
        int num = k-zz;
        root->left = create(qz+1,qz+num,zz,k-1,pre,vin);
        root->right= create(qz+1+num,qy,k+1,zy,pre,vin);
        return root;
    
;

JZ5:用两个栈实现队列


栈的特点是先进后出,队列是先进先出

先用stack1存入push的值,然后再存入stack2,那么倒了两次也就正了,第二个栈也就实现了先进先出…此后,出队都用stack2,而入队都用stack1,等stack2空了(不空就存入会影响顺序),再把stack1存进stack2.

class Solution

public:
    void push(int node) 
        stack1.push(node);
    

    int pop() 
        if(stack2.size()==0)
        
            while(stack1.size())
            
                stack2.push(stack1.top());
                stack1.pop();
            
        
        
        int p = stack2.top();
        stack2.pop();

        return p;
    

private:
    stack<int> stack1;
    stack<int> stack2;
;

JZ6:旋转数组的最小数字


特点: ① 数组非递减 ② 把一个数组最开始的若干个元素搬到数组的末尾

此处选择右端点进行比较:
① mid大于右端点:由于原本数组非递减,所以最小值一定在mid右边
② mid小于右端点:最小值为mid或mid左侧
③ mid等于右端点:无法确定最小值,因此不断左移右端点.

class Solution 
public:
    int minNumberInRotateArray(vector<int> rotateArray) 
        int l=0,r=rotateArray.size()-1;
        while(l<r)
        
            int mid=l+(r-l)/2;
            if(rotateArray[mid]>rotateArray[r])  l=mid+1;
            else if(rotateArray[mid]<rotateArray[r]) r=mid;
            else r--;
        
        return rotateArray[l];
    
;

JZ7:斐波那契数列


过于简单,不宜展示…


JZ8:跳台阶


此类题目思路就是,当前层的上一步的所有跳法之和
例如需要到第4层,且一次只能跳1或2层
那么就计算第3层和第2层的跳法之和即可,因为这两层可以一步到第4层

因为刚好是只能跳1或2层,所以代码和经典斐波那契差不多

class Solution 
public:
    int jumpFloor(int number) 
        if(number<=2) return number;
        int a=1,b=2,c;
        for(int i=3;i<=number;i++)
        
            c=a+b;
            a=b;
            b=c;
        
        return c;
    
;

JZ9:跳台阶扩展问题


找到了规律,如果找不到规律,根据题意, 每一层的跳法就是前面所有层的跳法加起来再+1(直接跳到该层) 即可

class Solution 
public:
    int jumpFloorII(int number) 
        if(number<=2) return number;
        return pow(2.0,number-1);
   
;

JZ10:矩形覆盖



这种类型的题八九不离十就是找规律(JZ7~JZ10代码都差不多),写几个出来就看得出来规律了

class Solution 
public:
    int rectCover(int number) 
        int a=1,b=2,c;
        if(number<2) return number;
        for(int i=3;i<=number;i++)
        
            c=a+b;
            a=b;
            b=c;
        
        return c;
    
;

以上是关于《剑指offer》JZ1 ~ JZ10的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》JZ1 ~ JZ10

牛客网剑指offer专题python解答JZ1---JZ12持续刷题中

牛客网剑指offer专题python解答JZ1---JZ12持续刷题中

牛客网剑指offer专题python解答JZ1---JZ12持续刷题中

剑指offer JZ1 二维数组中的查找

剑指offer JZ1 二维数组中的查找