《剑指offer》第2章 03-15题解

Python版剑指Offer题解 Python版剑指Offer题解 本题解配合leetcode中剑指Offer刷题使用 参考链接:图解算法数据结构 文章目录剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offe 阅读详情

第二章 面试需要的基础知识

1. 数组

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 
  • 排序后扫描复杂度O(nlogn)

  • 哈希表,空间复杂度O(n),时间复杂度O(n)

    原地哈希:有的元素多次重复,有的元素确实,使用原地哈希,其中某个正确元素一定在合适位置,那么遍历时每次比较当前元素是否与 合适位置重复,如果没有重复,就把它放到合适位置。

    时间复杂度O(n),空间复杂度O(1)

    int findRepeatNumber(vector<int>& nums) {
        for(int i = 0;i < nums.size(); ++i){//从头到尾扫描
            if(nums[i] == i) continue;//如果nums[i]在合适的位置,继续向前扫描
            else{//如果不在合适位置
                if(nums[i] == nums[ nums[i] ]) return nums[i];//比较当前元素是否与合适位置的元素重复
                else swap(nums[i],nums[nums[i]]);//如果不重复,就把当前元素放到合适位置
            }
        }
        return 0;
    }
变形题:不修改数组找出重复数字
  1. 创建一个长度为n+1的辅助数组,逐一把原数组的元素m复制到新数组对应下标为m的位置,如果该位置已经被修改,那么该数字重复。空间复杂度O(n)。
  2. 二分法:以0 ~ n-1的中点m为界,小于m的数如果超过了m个,则说明前m个数中有重复的,相反则证明后m个数有重复。再以0~m-1为界,继续缩小范围,继续缩小范围,则能找到该重复的数。空间复杂度为O(1),时间复杂度为O(nlogn)。以时间换空间。
剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

现有矩阵 matrix 如下:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。给定 target = 20,返回 false。

**解决一个复杂问题,通过分析简单具体的例子,试图寻找普遍规律。**发现从右上角开始分析作为突破口。

//从右上角遍历,比target小,就向下走,比target大,就往左走
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.empty()) return false;
        int n = matrix.size(),m = matrix[0].size();
        int i = 0,j = m-1;
        while(i < n && j >= 0){
            if(matrix[i][j] == target) return true;
            else if(matrix[i][j] < target){
                ++i;
            }else{
                --j;
            }
        }
        return false;
    }

2. 字符串

每个字符串都以字符‘\0’结尾,所以要注意越界。

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."
  • 第一种:在原来字符的基础上进行修改,那么就有可能覆盖修改该字符后面的内容。所以需要把空格后面的所有字符都后移2字节。因为每个空格后面的所有字符都要移动,所以时间复杂度是O(n^2)
  • 第二种:创建一个新的足够多的字符串,在新的字符串上进行复制。建立双指针,从后往前,旧指针指向旧字符串末尾,新指针指向新字符串末尾,碰到空格,旧指针-1,新指针-3;碰到字符,将对应字符复制到新字符串处。

是否高度警惕内存覆盖

    string replaceSpace(string str) {
        if(str.empty()) return "";
        int count = 0;//统计空格的个数
        for(auto & s:str){
            if(s == ' ') ++count;
        }
        int last = str.size()-1,newlast = str.size()+2*count-1;//last指向原数组末尾,newlast指向新数组末尾
        string res(newlast+1,'0');
        while(last >= 0){
            if(str[last] == ' '){//如果碰到空格,替换成“%20”
                --last;
                res[newlast--] = '0';
                res[newlast--] = '2';
                res[newlast--] = '%'; 
                continue;
            }
            res[newlast] = str[last];
            --last;
            --newlast;
        }
        return res;
    }

3.链表

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

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

输入:head = [1,3,2]
输出:[2,3,1]
  • 这道题第一反应是反转链表,修改指针指向,但这样子会改变原来链表的结构。

面试中如果打算修改输入的数据,一定要提前询问面试官是否允许修改。

  • 考虑到不能修改原链表结构,采用从头到尾遍历,用栈存储每次遍历结果,最后出栈。

  • 用递归来实现。每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。当链表非常 长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用 栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。

    vector<int> reversePrint(ListNode* head) {
        vector<int> res;
        stack<int> sk;
        if(!head) return res;
        while(head){
            sk.push(head->val);
            head = head->next;
        }
        while(!sk.empty()){
            res.emplace_back(sk.top());
            sk.pop();
        }
        return res;
    }

4.树

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
    3
   / \
  9  20
    /  \
   15   7

前序遍历第一个值3为根节点,将这个节点new出来。在中序遍历中快速找到3的坐标,那么3之前就是左子树的节点,3之后就是右子树的节点,那么分别递归 左子树和右子树 的前序,中序数组范围,为了方便快速找到某个元素在中序遍历中位置,建立hashmap映射元素和坐标的关系。

做了很多遍这个题,但最后return左右子树的范围时还是会犯错。

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty() || inorder.empty() ) return nullptr;
        unordered_map<int,int> hash;
        for(int i = 0;i < inorder.size(); ++i){
            hash[ inorder[i] ] = i;
        }
        return rebuildTree(preorder, hash, 0, preorder.size()-1, 0, inorder.size()-1 );
    }

    TreeNode* rebuildTree(vector<int>& preorder, unordered_map<int,int> &hash, int preStart, int preLast, int inStart, int inLast){
        if(preStart > preLast || inStart > inLast) return nullptr;
        int val = preorder[preStart];//根节点的值
        TreeNode * node = new TreeNode(val);
        int inIndex = hash[val];//中序遍历中根节点的坐标
        int leftlength = inIndex - inStart;//左子树长度
        node->left = rebuildTree(preorder, hash, preStart + 1, preStart + leftlength, inStart, inIndex-1);
        node->right = rebuildTree(preorder, hash,preStart + leftlength + 1, preLast, inIndex + 1, inLast);
        return node;
    }

5.栈和队列

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

两个栈:一个栈输入,作为主要存储,一直push。当需要delete时,另一个栈作为辅助输出,如果输出栈不为空,则删除栈顶元素;如果输出栈为空,则将输入栈全部出栈到输出栈,再删除栈顶元素。注意每次是输出栈全部被delete以后,再将输入栈新一轮的元素压栈。

class CQueue {
private:
    stack<int> input,output;
public:
    CQueue() {}
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        in2out();
        if(output.empty()) return -1;//注意这里需要判断,output为空,return-1
        int res = output.top();
        output.pop();
        return res;
    }
     //将输入栈的全部数据一次弹出,并压入输出栈中,这样子输出栈的顺序就是队列的顺序
    void in2out(){
        if(output.empty()){
            while(!input.empty()){
                int temp = input.top();
                input.pop();
                output.push(temp);
            }
        }
    }
};
变形题:用两个队列实现栈
  • 每次要存入一个元素,先入队1,再把队2中的元素全部出队,并入队1,最后再交换队列1和队列2,这样子队列2中队首元素永远是最新存入的元素。从而实现先入先出。

6.递归和循环

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

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

  • 一开始会考虑递归解法。如下图所示,这棵树有很多节点是重复的,而且重复节点数会随着n的增大急剧增加。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjCwLS6Q-1621498837164)(images/image-20210519145352047.png)]

  • 所以最好是把已经得到的数列中间项保存起来,下次计算的时候先查找一下。类似动态规划中的空间压缩。

        int fib(int n) {
            if(n < 2) return n;
            long long f0 = 0;//前两个状态的值
            long long f1 = 1;//前一个状态的值
            long long fN = 0;//当前状态值
            for(int i = 2;i <= n; ++i){
                fN = (f1 + f0)%1000000007;//当前状态值只与前两个状态有关
                f0 = f1;
                f1 = fN;
            }
            return fN;
        }
    
剑指 Offer 10- II. 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

输入:n = 7
输出:21

到达当前台阶有两种方法,第一种是从上一个台阶跳一个,或者是从上两个台阶跳两个,所以当前台阶的跳法是上一个台阶和上两个台阶跳法之和dp[i] = dp[i-1] + dp[i-2]

/*
    int numWays(int n) {
        if(n < 2) return 1;
        vector<int> dp(n+1,0);//dp[i]表示当前第i级台阶总共有多少种跳法
        dp[0] = 1;//0阶台阶有1种跳法
        dp[1] = 1;//1阶台阶有一种跳法
        for(int i = 2;i <= n;++i){
            dp[i] = (dp[i-1] + dp[i-2])%1000000007;
        }
        return dp[n];
    }
    */
    //类似斐波那契,进行空间降压缩
    int numWays(int n){
        if(n < 2) return 1;
        int step0 = 1,step1 = 1,stepN = 0;
        for(int i = 2;i <= n; ++i){
            stepN = (step0 + step1)%1000000007;
            step0 = step1;
            step1 = stepN;
        }
        return stepN;
    }
剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

输入:[3,4,5,1,2]
输出:1

在旋转数组里求最小值,最小值应该是旋转的分界线。利用二分法:当前中点,如果它指向的值小于等于右端,那么右区间是排好序的;反之,那么说明左区间是排好序的。
这个题难点在于:如果数组中存在重复元素,有可能出现中点值==右端值时,无法判断哪个区间是排好序,需单独right–。相当于区间遍历。

    int minArray(vector<int>& numbers) {
        int left = 0, right = numbers.size()-1;
        int minNum = numbers[right];
        while(left <= right){
            int mid = (left + right)/2;
            minNum = min(minNum,numbers[mid]);
            if(numbers[mid] < numbers[right]){//右半段正常顺序,最小值可能在左半段
                right = mid-1;
            }else if(numbers[mid] > numbers[right]){//左半段正常顺序,最小值可能在右半段
                minNum = min(minNum,numbers[left]);
                left = mid+1;
            }else{//如果相等,无法确定哪半段是正常顺序
                --right;
            }
        }
        return minNum;
    }

7.回溯法

剑指offer12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
    bool exist(vector<vector<char>>& board, string word) {
        if(word.empty()) return true;
        if(board.empty() || board[0].empty()) return false;
        int m = board.size(),n = board[0].size();
        vector<vector<bool>> visited(m, vector<bool>(n,false));//falg标志每个字符是否作为单词的一部分
        bool isFind = false;
        for(int i = 0; i < m; ++i){
            for(int j = 0; j < n; ++j){
                traceBack(board, word, visited, 0, i, j, isFind);
                if(isFind) return true;
            }
        }
        return false;
    }
    void traceBack(vector<vector<char>>& board, string &word, vector<vector<bool>> &visited, int pos, int i, int j, bool & isFind){
        if(i < 0 || i >= board.size() || j < 0 || j >= board[0].size()) return;//如果越界,返回
        if(visited[i][j] || isFind || board[i][j] != word[pos]) return;//访问过的,或已经找到了,或当前查找不匹配的,返回
        if(pos == word.size()-1){//当前查找字符 刚好为 最后一个匹配,表示找到该单词
            isFind = true;
            return;
        }
        visited[i][j] = true;
        traceBack(board, word, visited, pos + 1, i - 1, j, isFind);//上
        traceBack(board, word, visited, pos + 1, i + 1, j, isFind);//下
        traceBack(board, word, visited, pos + 1, i, j - 1, isFind);//左
        traceBack(board, word, visited, pos + 1, i, j + 1, isFind);//右
        visited[i][j] = false;//回溯修改状态
    }
剑指 Offer 13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

输入:m = 2, n = 3, k = 1
输出:3

根据数位和增量公式得知,数位和每逢 进位 突变一次。根据此特点,矩阵中 满足数位和的解 构成的几何形状形如多个 等腰直角三角形,由于机器人一次只能走一步,而三角形之间不一定是联通的,因此机器人不一定能够到达所有满足数位的点。由于不可达解的存在,不能直接遍历统计多个三角形的面积。

机器人从坐标(0,0)开始,当准备进入坐标(i,j)时,先判断是否越界,或已经访问过,或不满足数位,如果不能进入,返回0,面积无变化;如果可以进入,修改已经访问该点,并对相邻的其他四个方向进行搜索,且面积+1。

    int movingCount(int m, int n, int k) {
        if(!k) return 1;
        vector<vector<bool>> visited(m,vector<bool>(n,false));//是否已经到达
        return traceBack(visited, 0, 0, k);
    }
    int traceBack(vector<vector<bool>> & visited, int i, int j, int &k){
        if(i < 0 || i >= visited.size() || j < 0 || j >= visited[0].size() || visited[i][j] || getSum(i) + getSum(j) > k) return 0;
        //越界,已经访问过,和大于k,return 0
        visited[i][j] = true;//把已经访问过的修改为true
        return 1 + traceBack(visited, i - 1, j, k) + traceBack(visited, i + 1, j, k) + traceBack(visited, i, j - 1, k) + traceBack(visited, i, j + 1, k);
    }
    int getSum(int num){//计算某个数各个位之和
        int sum = 0;
        while(num){
            sum += num%10;
            num /= 10;
        }
        return sum;
    }

8.动态规划与贪婪算法

剑指 Offer 14- I. 剪绳子

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

这里的dp[1],dp[2],dp[4]不是真正长度为1,2,3以后被剪的最优解,由于是乘积,乘1相当于无效,所以给前三个状态提前存好初始值。dp[4] = max(1*3 , 2*2 , 3*1) = 4``dp[5] = max(1*4, 2*3 = = 6即dp[n] = max(dp[i] * dp[n-i])

    int cuttingRope(int n) {
        if(n < 2) return 0;//如果绳子长为0,1,最大乘积为0
        if(n <= 3) return n-1;//如果绳子长为2,乘积为1;长为3,乘积为2
        vector<int> dp(n+1,0);//长度为i的绳子被剪以后的最优解
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 3;
        for(int i = 4; i <= n; ++i){
            for(int j = 1; j <= i/2; ++j){
                dp[i] = max(dp[i], dp[j] * dp[i-j]);
            }
        }
        return dp[n];
    }
剑指 Offer 14- II. 剪绳子 II

使用贪心算法解决上题:绳子长度>=5时,剪成长度为3的每小段;绳子长度==4,剪成长度为2的两小段。

    int cuttingRope(int n) {
        if(n < 2) return 0;
        if(n <= 3) return n-1;
        long res = 1;
        while(n>4){//当绳子长度>4的时候多全部剪成3d
           res = ( res * 3 )%1000000007;
           n -= 3;
        }
        return ( res*n) %1000000007;
    }

9.位运算

剑指 Offer 15. 二进制中1的个数

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

输入:00000000000000000000000000001011
输出:3

右移运算时。如果数字是无符号数,则用0填补高位;如果是有符号数,则用符号位填补高位。例如数字原先是负数,右移之后在左边补n个0。

/*注意:把n右移,与1做&运算,可能会导致死循环,因为无符号数右移,高位补0,但如果是负数,右移后,高位补1;
方法1:所以此题应该是把1左移,直到左移32次以后,变成0
    int hammingWeight(uint32_t n) {
        int count = 0;
        uint32_t flag = 1;
        while(flag){
            if( n&flag ) ++count;
            flag <<= 1;
        }
        return count;
    }*/
/*方法1中无论有几个1,都要运行32次。
方法2:整数中有几个1就运行几次。
把一个整数减1,再和原整数做与运算,会把原整数最右侧的1变成0,那么一个二进制数有几个1就可以做几次这个运算。
*/
    int hammingWeight(uint32_t n) {
        int count = 0;
        while(n){
            ++count;
            n = (n-1)&n;
        }
        return count;
    }
Diffusion Models扩散模型与深度学习(数学原理和代码解读) ​ 此前GANs霸占各大顶会很多年,DDPM的出现让人耳目一新!经过这两年的发展,Diffusion Models能在图像生成、超分辨率重建、点云生成、语音生成等领域达到SOTA。这篇文章旨在帮助没有了解过的读者入门,《Diffusion Models与深度学习专栏》已经写了将近三十篇文章,既有原理公式和必备基础知识的讲解,也有代码详细实战解读,还有前沿热门应用,欢迎读者订阅。 阅读详情

相关推荐

主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效

通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了“串行总线控制器总是感叹号”的关联问题。正好办公室电脑都装有teamviwer常用来远程办公(在家偷懒)。所以通过远程发现电脑室可以运行的。并在控制面板发现:通用串行总线控制器总是感叹号,插入外设时USB无反应。如图:​ 并且右键选中其中一个,点击最后一个选项:“属性” 可以发现“设备状态”中会提示“由...

xiao_bai_0_0的博客 2万+

腾讯面试题,如何寻找一个数组里面唯一不重复的元素?要求时间复杂度o(n)和空间复杂度o(1)

找出不重复的数 题目描述: 有一组存放 ID 的数据。并且 ID 取值为 0 - (N-1) 之间,其中只有一个 ID 出现的次数为 1,其他的 ID 出现的次数都等于 2,问如何找到这个次数为 1 的 ID ?       解法一:巧用数组下标       我的第一想法便是...

dreamispossible的博客 2775

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 677

《剑指Offer》第二章

第一题:赋值运算符 class MyString { public: MyString(char *data = NULL); MyString(const MyString &str); ~MyString() private: char *m_pData; };注意点:返回值类型、参数类型、证同处理、内存泄漏 MyString& operator=(cons

xufeilong520xu的专栏 288

告别绕线!用Altium Designer从零设计一个PCB平面变压器(附3D模型)

本文详细介绍了如何使用Altium Designer从零设计一个PCB平面变压器,包括磁芯选型、电气参数计算、PCB设计实战技巧以及3D验证与生产输出。通过将绕组直接集成到PCB层中,配合嵌入式磁芯,实现了小型化、高功率密度的电源设计,适用于中低电流、高频应用场景。附3D模型,帮助读者快速掌握这一创新设计流程。

weixin_33716154的博客 441

iOS In-App Purchase 自动续订订阅完整实现指南

本文摘要: 自动续订订阅是iOS应用变现的核心模式,适用于流媒体、云存储等持续服务场景。文章系统讲解了从配置到实现的完整流程:首先对比各类订阅模式特点,解析订阅生命周期和关键术语;然后详细说明App Store Connect中的订阅组创建、产品配置和服务器通知设置;最后展示客户端StoreKit实现方案,包括产品标识符定义、订阅管理器封装和支付队列观察机制。全文提供可落地的代码示例和技术细节,帮助开发者掌握自动续订订阅的全链路实现。

Sheffi 1755

剑指offer——第二章

一、编程语言 1.C++概念理解题 面试官:定义一个空的类型,里面没有任何成员变量和成员函数。对该类型求sizeof,得到的结果是多少? 应聘者:答案是1 面试官:为什么不是0? 应聘者:空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例.至于占用多少内存,由编译器决定。在VisuaI studio中,...

苹果果的博客 218

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 256

剑指offer第二章

2.2.2 c++中struct 与 class 的区别  : 如果没有表明成员函数或者成员变量的访问权限级别,那么在struct中默认的是public,在class中默认的是private。          衍生知识:  三种访问控制权限 访问权限 public protected private 对本类 可见 可见 可见 对子类 ...

cloudyfei的博客 149

State of GPT (ChatGPT 原理及现状介绍)

要用 RLHF 的一个简单的原因就是 RLHF 模型效果更好,下面的图来源于 InstructGPT 论文,PPO (RLHF 算法) 后的模型生成的答案更被人类喜欢。karpathy 认为 RLHF 有用的原因是判别比生成更容易,让标注员去写一些 SFT 的 QA 数据对是比较难的,如果有一个 SFT 模型生成一些数据让标注员判断哪个更好就简单很多。,GPT4 最强,前三个都是 RLHF 模型,其他模型都是 SFT 模型。伯克利做的模型评测榜单。

kebijuelun的博客 3577

YOLOv8改进,YOLOv8添加DCNv4可变性卷积(windows系统成功编译),全网最详细教程

DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6468

[剑指offer] JAVA版题解(完整版)

本文首发于我的个人博客:尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二...

尾尾部落 6万+

基于A*算法的二维栅格地图路径规划与避障MATLAB仿真

本文将介绍如何使用MATLAB编写基于A*算法的二维栅格地图路径规划与避障的仿真程序。我们可以使用二维数组表示地图,其中每个元素表示一个栅格的状态,例如1表示障碍物,0表示可行走区域。接下来,我们需要定义A*算法的节点类。G值表示从起始节点到当前节点的代价,H值是启发式函数估计的从当前节点到目标节点的代价。算法,我们可以有效地找到起始点到目标点的最短路径,并在仿真中进行可视化展示。算法的基本思路是从起始节点开始,按照一定的启发式函数选择下一个节点,直到找到目标节点或者遍历完所有可行走区域。

ByteWhizX的博客 1273

刷题——[剑指 offer] JAVA 版题解

序号 题解 牛客 OJ 数据结构类型 03 [剑指 offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指 offer] 替换空格 替换空格 字符串 05 [剑指 offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指 offer] 重建二叉树 重建二叉树 ...

程序员世杰 2296

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【目录】LeetCode《剑指Offer》java题解分类汇总

1.链表 1.剑指Offer06从头到尾打印链表java题解 2.剑指 Offer 18. 删除链表的节点java题解 3.剑指 Offer 22. 链表中倒数第k个节点java题解 4.剑指 Offer 24. 反转链表Java题解 5.剑指 Offer 25. 合并两个排序的链表Java题解 6.剑指 Offer 35. 复杂链表的复制java题解 7.剑指 Offer 36. 二叉搜索树与双向链表java题解 8.剑指 Offer 52. 两个链表的第一个公共节点java题解 2.树 1.剑指 Off

乾坤未定,你我皆是黑马 1109

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LeetCode剑指offer题目分类汇总及题解

LeetCode剑指offer的分类总结,可以作为刷题指南和题解,方便刷题和汇总

艾醒的博客 1934

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

剑指 Offer(第 2 版)

目录剑指 Offer 03. 数组中重复的数字题目介绍题目实现剑指 Offer 04. 二维数组中的查找题目介绍[240. 搜索二维矩阵 II](https://leetcode-cn.com/problems/search-a-2d-matrix-ii/)题目实现剑指 Offer 05. 替换空格题目介绍题目实现剑指 Offer 06. 从尾到头打印链表题目介绍题目实现剑指 Offer 07. 重建二叉树题目介绍[105. 从前序与中序遍历序列构造二叉树](https://leetcode-cn.com/

轻松的小希 3149

牛客网剑指offer java 全部题解

经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助。 每天一道剑指offer-二维数组中的查找 https://mp.weixin.qq.com/s?__biz=MzI5MzYzMDAwNw==&amp;mid=2247484262&amp;idx=2&amp;sn=83fb17...

WantFlyDaCheng的博客 1568

剑指Offer题解——数组

文章目录剑指 Offer 03. 数组中重复的数字解法剑指 Offer 04. 二维数组中的查找解法剑指 Offer 29. 顺时针打印矩阵解法剑指 Offer 53 - I. 在排序数组中查找数字 I解法剑指 Offer 53 - II. 0~n-1中缺失的数字解法推荐阅读 剑指 Offer 03. 数组中重复的数字 力扣链接 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请

wardseptember的博客 670

剑指offer题型汇总及个人建议

目录考点分类难度分类全部题解链接建议感想 考点分类 我自己的理解,不喜勿喷。 链表: 二叉树: 排序: 搜索: 数学逻辑: 字符串: 数组: 难度分类 本身牛客网的难度等级我感觉其实不是很合理,有时候他标的难题反而简单,中等题反而会卡我好久,下面是我列出来的难度分类。不喜勿喷。 简单: 中等: 较难: 困难: 全部题解链接 剑指offer(01-03)题解 剑指offer(04-06)题解 剑指offer(07-09)题解 剑指offer(10-12)题解 剑指offer(13-15)题解 剑指offer(

lovely__RR的博客 1605

算法题解(剑指Offer篇)

文章目录栈与队列(简单)*剑指 Offer 09. 用两个栈实现队列 - 12.27剑指 Offer 30. 包含min函数的栈 - 12.27链表(简单)*剑指 Offer 06. 从尾到头打印链表 - 12.28剑指 Offer 24. 反转链表 - 12.28剑指 Offer 35. 复杂链表的复制 - 12.28 栈与队列(简单) *剑指 Offer 09. 用两个栈实现队列 - 12.27 剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 app

x-dragon8899的博客 1463

【剑指Offer】Java题解汇总

【剑指Offer】Java题解汇总01. 数组中重复的数字02. 二维数组中的查找03. 替换空格04. 从尾到头打印链表05. 重建二叉树06. 用两个栈实现队列07. 斐波那契数列08. 青蛙跳台阶问题09. 旋转数组的最小数字10. 矩阵中的路径11. 机器人的运动范围12. 剪绳子<动态规划>13. 剪绳子<贪心算法,大数取余>14. 二进制中1的个数15. 数值的整数次方16. 打印从1到最大的n位数(大数问题)17. 删除链表的节点18. 正则表达式匹配(Hard)19.

Lujiahao98689的博客 580

[剑指offer] JAVA版题解(全)

序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二叉树 重建二叉树 树 07 [剑指offer] 用两个栈实现队列 用...

尾尾部落 1375

【C++】leetcode力扣 剑指 Offer 题解

文章预览:剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offer 12. 矩阵中的路径剑指 Offer 13. 机器人的运动范围剑指 Offer 14- I. 剪绳子剑指 Of

qq_43050258的博客 2056

【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer] [剑指offer][JAVA]面试题第[06]题[从尾到头打印链表][栈][递归] [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList] [剑指offer][JAVA]面试题第

dadongwudi的博客 726

剑指Offer三天挑战赛03~15

剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:输出:2 或 3限制:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-z著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2401_85767533的博客 639
上一篇: B站杜老师数据库课堂笔记day03
下一篇: 《剑指offer》第三章 16-26题解
Netfishless
博客等级 码龄9年 3640粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值