IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《剑指offer》JZ1 ~ JZ10 -> 正文阅读

[数据结构与算法]《剑指offer》JZ1 ~ JZ10


JZ1:二维数组中的查找

在这里插入图片描述
每个一维数组都用二分找.
看了题解还有直接二维数组二分的…

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        for(int i=0;i<array.size();i++)
        {
            if(array[i].size()==0) continue;
            if(array[i][0] > target) break;
            
            int l=0,r=array[i].size()-1;
            while(l<=r)
            {
                int mid = l+(r-l)/2;
                if(array[i][mid]>target) r=mid-1;
                else if(array[i][mid]<target) l=mid+1;
                else return true;
            }
            
        }
        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;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:32:05  更:2021-08-13 12:32:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:41:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码