算法(1)——双指针

2023-12-17

双指针

我们常见的双指针的形式有两种,一种是对撞指针,一种是快慢指针!

对撞指针:一般用于顺序结构中,也称左右指针。

1、对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐向中间逼近。

2、对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果跳出循环),也就是以下两种情况

left == right  (两个指针指向同一个位置)

left  >  right(两个指针错开)

快慢指针:又称为龟兔赛跑算法。

1、其基本意思是使用两个移动速度不同的指针在数组或者链表等序列结构上移动。

2、这种方法对于处理环形链表或者数组非常有用。

3、在⼀次循环中,每次让慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢。

一、移动零

283. 移动零 - 力扣(LeetCode)

1、题目描述:

给定⼀个数组 nums ,编写⼀个函数将所有 0 移动到数组的末尾,同时保持⾮零元素的相对顺序。
请注注意,必须在不复制数组的情况下原地对数组进⾏操作。

⽰例1:
输⼊: nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
⽰例2
输⼊:nums = [0]
输出:[0]

2、算法思路:

在本题中,我们可以⽤⼀个cur 指针来扫描整个数组,另⼀个 dest 指针⽤来记录⾮零数序列的最后⼀个位置。根据cur在扫描的过程中,遇到的不同情况,分类处理,实现数组的划分。在 cur 遍历期间,使[0, dest] 的元素全部都是⾮零元素, [dest + 1, cur - 1] 的元素全是零。

当我们遍历数组是遇到0时只需要  cur++  ,遇到非0时只需要dest++,并且交换dest和cur位置的元素,之后让cur++,扫描下一个元素。

3、算法代码:

class Solution
{
public:
    void moveZeroes(vector<int>& nums)
    {
        for(int cur = 0, dest = -1; cur < nums.size(); cur++)
        {    
            if(nums[cur]) // 处理⾮零元素
            {
                swap(nums[++dest], nums[cur]);
            }    
        }
    }
};

二、复写0

1089. 复写零 - 力扣(LeetCode)

1、题目描述

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 1:


输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:
输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]
  

2、算法思路:

如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数 [被覆盖掉]。因此我们选择「从后往前」的复写策略。
但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两
步:
i. 先找到最后⼀个复写的数;
ii. 然后从后向前进⾏复写操作

3、算法代码

class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur=0,dest=0;
        //先找出最后一位数
        while(cur<arr.size())
        {
            if(arr[cur])
            {
                dest++;
            }
            else
            {
                dest+=2;
            }
            if(dest>=arr.size())
            {
                break;
            }
            cur++;
        }
        //边界情况
        if(dest==arr.size()+1)
        {
            arr[arr.size()-1]=0;
            dest-=2;
            cur--;
        }
        //从后往前开始复习

        while(cur>=0)
        {
            if(arr[cur])
            {
                arr[--dest]=arr[cur];
            }
            else{
                arr[--dest]=0;
                arr[--dest]=0;
            }
            cur--;
        }
    }
};

三、快乐数

202. 快乐数 - 力扣(LeetCode)

1、题目描述

编写⼀个算法来判断⼀个数 n 是不是快乐数。
「快乐数」定义为:
◦ 对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和。
◦ 然后重复这个过程直到这个数变为1,也可能是⽆限循环但始终变不到 1 。
◦ 如果这个过程结果为 1 ,那么这个数就是快乐数。
◦ 如果 n 是快乐数就返回 true ;不是,则返回 false 。
⽰例1:
输⼊: n = 19
输出: true
解释:
19 -> 1 * 1 + 9 * 9 = 82
82 -> 8 * 8 + 2 * 2 = 68
68 -> 6 * 6 + 8 * 8 = 100
100 -> 1 * 1 + 0 * 0 + 0 * 0 = 1
⽰例2:
输⼊: n = 2
输出: false
解释:(这⾥省去计算过程,只列出转换后的数)

2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16
往后就不必再计算了,因为出现了重复的数字,最后结果肯定不会是 1

2、算法思路:

为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和」这⼀个
操作记为 x 操作;
题⽬告诉我们,当我们不断重复 x 操作的时候,计算⼀定会「死循环」,死的⽅式有两种:
▪ 情况⼀:⼀直在 1 中死循环,即1 -> 1 -> 1 -> 1......
▪ 情况⼆:在历史的数据中死循环,但始终变不到 1
由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情
况⼆」中进⾏,就能得到结果。

三、算法嗲吗

class Solution {
public:
    int mulsum(int n)
    {
        int sum=0;
        while(n)
        {
            sum+=pow(n%10,2);
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) 
    {
        int fast=mulsum(n);
        int slow=n;

        while(fast!=slow)
        {
            slow=mulsum(slow);
            fast=mulsum(mulsum(fast));
        }
        return slow==1;
    }
};

四、盛水最多的容器

11. 盛最多水的容器 - 力扣(LeetCode)

1、题目描述:

给定⼀个⻓度为 n 的整数数组height。有 n 条垂线,第i条线的两个端点是 (i, 0) 和 (i,height[i]) 。
找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的⽔。
返回容器可以储存的最⼤⽔量
说明:你不能倾斜容器。
⽰例1:
输⼊: [1,8,6,2,5,4,8,3,7]
输出: 49

解释:图中垂直线代表输⼊数组 [1,8,6,2,5,4,8,3,7] 。在此情况下,容器能够容纳⽔(表⽰为蓝⾊部分)的最⼤值为49 。

2、算法思路:

(1)暴力求解(会超时)

枚举出能构成的所有容器,找出其中容积最⼤的值。
容器容积的计算⽅式:
设两指针i , j ,分别指向⽔槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于容器的⾼度由两板中的短板决定,因此可得容积公式: v = (j - i) * min(height[i], height[j])

(2)对撞指针

设两个指针 left ,right 分别指向容器的左右两个端点,此时容器的容积:
v = (right - left) * min( height[right], height[left])
容器的左边界为 height[left] ,右边界为 height[right] 。
为了⽅便叙述,我们假设「左边边界」⼩于「右边边界」。
如果此时我们固定⼀个边界,改变另⼀个边界,⽔的容积会有如下变化形式:
◦ 容器的宽度⼀定变⼩。
◦ 由于左边界较⼩,决定了⽔的⾼度。如果改变左边界,新的⽔⾯⾼度不确定,但是⼀定不会超
过右边的柱⼦⾼度,因此容器的容积可能会增⼤。
◦ 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会
超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。
由此可⻅,左边界和其余边界的组合情况都可以舍去。所以我们可以 left++ 跳过这个边界,继
续去判断下⼀个左右边界。
当我们不断重复上述过程,每次都可以舍去⼤量不必要的枚举过程,直到 left 与 right 相
遇。期间产⽣的所有的容积⾥⾯的最⼤值,就是最终答案

3、代码实现:

class Solution {
public:
    int maxArea(vector<int>& height) 
    {
        int n=height.size();
        int left=0,right=n-1;
        int max=0;
        while(right>left)
        {
            int v=((right-left)*min(height[left],height[right]));
            max=fmax(max,v);
            if(height[left]>height[right])
            {
                right--;
            }
            else
            {
                left++;
            }
            
        }
        return max;
    }
};

五、有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode)

1、题目描述:

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:


输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3  

示例 2:


输入: nums = [4,2,3,4]
输出: 4  

2、算法思路:

(1)暴力求解(会超时)

三层 for 循环枚举出所有的三元组,并且判断是否能构成三⻆形。
判断三⻆形的优化:
▪ 如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。但是实际上只需让较⼩的两条边
之和⼤于第三边即可。
▪ 因此我们可以先将原数组排序,然后从⼩到⼤枚举三元组,⼀⽅⾯省去枚举的数量,另⼀⽅
⾯⽅便判断是否能构成三⻆形。

class Solution {
public:
    int triangleNumber(vector<int>& nums) 
    {
        int n=nums.size();
        int count=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                for(int k=j+1;k<n;k++)
                {
                    if(nums[i]+nums[j]>nums[k])
                    {
                        count++;
                    }
                }
            }
        }
        return count;
    }
};

(2)排序+双指针

先将数组排序。
根据「解法⼀」中的优化思想,我们可以固定⼀个「最⻓边」,然后在⽐这条边⼩的有序数组中找
出⼀个⼆元组,使这个⼆元组之和⼤于这个最⻓边。由于数组是有序的,我们可以利⽤「对撞指针」来优化。
设最⻓边枚举到 i 位置,区间 [left, right] 是 i 位置左边的区间(也就是⽐它⼩的区间):
◦ 如果 nums[left] + nums[right] > nums[i] :
▪ 说明 [left, right - 1] 区间上的所有元素均可以与 nums[right] 构成⽐nums[i] ⼤的⼆元组
▪ 满⾜条件的有 right - left 种
▪ 此时 right 位置的元素的所有情况相当于全部考虑完毕, right-- ,进⼊下⼀轮判断
◦ 如果 nums[left] + nums[right] <= nums[i] :
▪ 说明 left 位置的元素是不可能与[left + 1, right] 位置上的元素构成满⾜条件的⼆元组
▪ left 位置的元素可以舍去, left++ 进⼊下轮循环

3、算法代码:

class Solution {

public:

    int triangleNumber(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        int sum=0;
        for(int i=nums.size()-1;i>=2;i--)
        {
            int left=0,right=i-1;
            while(right>left)
            {
                if(nums[left]+nums[right]>nums[i])
                {
                    sum=sum+(right-left);
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return sum;
    }
};

六、和为S的两个数字

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

1、题目描述:

输⼊⼀个递增排序的数组和⼀个数字 s ,在数组中查找两个数,使得它们的和正好是 s 。如果有多对数字的和等于 s ,则输出任意⼀对即可。
⽰例1:
输⼊: nums = [2,7,11,15], target = 9
输出: [2,7] 或者 [7,2]

2、算法思路:

(1)暴力求解(会超时)

两层 for 循环列出所有两个数字的组合,判断是否等于⽬标值。

(2)对撞指针

由于题目给的是一个递增排序的数组,我们就可以利用数组的单调性,

设指针i指向第一个元素,也就是最小的一个元素,设指针j指向最后一个元素。设两个的和s = nums[i] + nums[j],如果s > target,就意味着nums[j] 分别与 nums[0], nums[1], nums[2]...nums[j - 1]构成的和都是 > target的,此时就需要j--。

同理如果s < target, 就意味着nums[i] 分别与 nums[i + 1], nums[i + 2]...nums[j]构成的和都是 < target的,因此i++。

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        int n=price.size();
        int left=0,right=n-1;
        while(right>left)
        {
            int sum=price[left]+price[right];
            if(sum>target)
            {
                right--;
            }
            else if(sum<target)
            {
                left++;
            }
            else{
                return {price[left],price[right]};
            }
        }
        return {-1,-1};
    }
};

七、三数之和

15. 三数之和 - 力扣(LeetCode)

1、题目描述:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j i != k j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

示例 1:


输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。  

示例 2:


输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
  

示例 3:


输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。  

2、算法思路:

与两数之和稍微不同的是,题⽬中要求找到所有「不重复」的三元组。那我们可以利⽤在两数之和
那⾥⽤的双指针思想,来对我们的暴⼒枚举做优化:

i. 先排序;
ii. 然后固定⼀个数 a :
iii. 在这个数后⾯的区间内,使⽤「双指针算法」快速找到两个数之和等于 -a 即可。
但是要注意的是,这道题⾥⾯需要有「去重」操作
i. 找到⼀个结果之后, left 和 right 指针要「跳过重复」的元素;
ii. 当使⽤完⼀次双指针算法之后,固定的 a 也要「跳过重复」的元素

3、算法代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        vector<vector<int>> vv;
        int n=nums.size();
        for(int i=0;i<n;)
        {
            if(nums[i]>0) break;
            int left=i+1,right=n-1,targe=-nums[i];
            while(right>left)
            {
                int sum=nums[left]+nums[right];
                if(sum>targe) right--;
                else if(sum<targe) left++;
                else 
                {
                    vv.push_back({nums[i],nums[left],nums[right]});
                    right--,left++;
                    while(right>left&&nums[left]==nums[left-1]) left++;
                    while(right>left&&nums[right]==nums[right+1]) right--;
                }
            }
            i++;
            while(i < n && nums[i] == nums[i-1]) i++;
        }
        return vv;
    }
};

八、四数之和

18. 四数之和 - 力扣(LeetCode)

1、题目描述:

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且 不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a b c d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:


输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
  

示例 2:


输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]  

2、算法思路:

(1). 依次固定⼀个数 a ;
(2). 在这个数 a 的后⾯区间上,利⽤「三数之和」找到三个数,使这三个数的和等于 target- a 即可

3、算法代码:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> vv;
        sort(nums.begin(),nums.end());
        int n=nums.size();
        for(int i=0;i<n;) //定一个数
        {
            for(int j=i+1;j<n;)  //三数之和
            {   
                int left=j+1,right=n-1;
                long long aim=(long long)target-nums[i]-nums[j];
                while(right>left)
                {
                    int sum=nums[left]+nums[right];
                    if(sum>aim) right--;
                    else if(sum<aim) left++;
                    else{
                    vv.push_back({nums[i],nums[j],nums[left++],nums[right--]});
                    while(right>left&&nums[left]==nums[left-1]) left++;
                    while(right>left&&nums[right]==nums[right+1]) right--;
                }
                }
                j++;
                while(j<n&&nums[j]==nums[j-1]) j++;
            }   
            i++;
            while(i<n&&nums[i]==nums[i-1]) i++;
        }
        return vv;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法(1)——双指针 的相关文章

  • C#中如何检测字符串是否为货币

    通常当我需要转换时currency string 如 1200 55 z 或 1 249 到十进制值我这样做 if currencyString Contains z decimal value Decimal Parse dataToCh
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 为什么以下代码不允许我使用 fgets 获取用户输入但可以使用 scanf?

    这是一个更大程序的简短摘录 但该程序的其余部分无关紧要 因为我认为我能够隔离该问题 我怀疑这与我使用 fgets 的方式有关 我读过 最好使用 fgets 而不是 scanf 但我似乎无法让它在这里正常工作 当我使用以下代码时 程序不会给我
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库

随机推荐

  • SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

    前段时间忙于接口测试 也看了几款接口测试工具 简单从几个角度做了个比较 拿出来与诸位分享一下 本文 从多个方面对接口测试的三款常用工具进行比较分析 以便于在特定的情况下选择最合适的工具 或者使用自己编写的工具 不同工具定位不同 我们只是主要
  • 关于在redis中查找键值对报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to...的问题

    valueOperations get SystemInfo 返回linkedHashMap类型 在Java中 LinkedHashMap 是一个类 它继承自 HashMap 并保持插入顺序 它的设计使得我们可以更容易地按照插入顺序迭代元素
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 谷歌浏览器导出非http无法直接打开

    解决方法 1 打开谷歌浏览器右上角三个点 点击设置前往隐私和安全菜单 2 打开隐私和安全点击网站设置 网站设置拉至页面最下方 展开更多设置点击不安全内容页面 不安全内容页面最下方添加网站网址即可
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 基于ssm足球联赛管理系统

    摘 要 随着计算机技术发展 计算机系统的应用已延伸到社会的各个领域 大量基于网络的广泛应用给生活带来了十分的便利 所以把足球联赛管理与现在网络相结合 利用计算机搭建足球联赛管理系统 实现足球联赛管理系统的信息化 则对于进一步提高足球联赛管理
  • WOA-BILSTM-Attention基于鲸鱼算法优化双向长短期记忆网络结合注意力机制回归预测,多变量输入模型

    文章目录 效果一览 文章概述 订阅专栏只能获取专栏内一份代码 部分源码 参考资料
  • arm Linux中dma的cache管理

    概述 前两周有人询问DMA下的cache操作和dma coherent 以前零碎看过代码 临时找 还没有找到 这两天整理了调用流程 也找到了dma coherent的用法 Linux的文档里没有详细说明dma coherent的用法 根据代
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • linux面试题分享

    1 简述RAID0 1 5 10的区别 什么是LVM RAID与LVM的使用场景 RAID0需要两块以上硬盘 不提供冗余或错误修复能力 速度快 磁盘利用率100 RAID1需要两块以上硬盘 提供数据块冗余 磁盘利用率50 RAID5需要三块
  • 应对压力:14个方法助你有效缓解

    在快节奏的现代生活中 我们常常会感受到各种各样的压力 这些压力可能来自于工作 学习 人际关系 甚至是生活中的一些琐事 过度的压力会对我们的身心健康造成严重的影响 因此学会有效地缓解压力变得尤为重要 本文将介绍14个简单易行的方法 帮助你应对
  • 嵌入式开发、C++后端开发、C++音视频开发怎么选择?

    嵌入式开发 C 后端开发和C 音视频开发的选择问题 近年来 随着互联网和物联网的快速发展 嵌入式开发 C 后端开发和C 音视频开发等职业领域也逐渐受到广泛关注 对于有志于从事这些领域的人来说 如何做出选择呢 下面将从前景 薪酬和职业稳定性等
  • The content of element type “mapper“ must match “(cache-ref|cache|resultMap*|parameterMap*|sql*|inse

    这段话的意思是告诉你标签没有写全 比如
  • 软件测试市场复苏了!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • lv12 uboot移植深化 9

    u boot 2013 0 1移植 实验目的 了解 u boot 的代码结构及移植 的基本 方法 实验环境 u buntu 14 04
  • 200.岛屿数量(bfs写法)

    宽搜的正常思路 只不过每次加上计算岛屿数量cnt即可 class Solution public int numIslands char grid int n grid length int m grid 0 length int dx n
  • 测试用例设计方法六脉神剑——第一剑:入门试招,等价边界初探

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 8k次 点赞82次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • WOA-BIGRU-Attention基于鲸鱼算法优化双向门控循环单元结合注意力机制回归预测,多变量输入模型

    文章目录 效果一览 文章概述 订阅专栏只能获取专栏内一份代码 部分源码 参考资料
  • lv12 交叉编译工具链 7

    目录 1 交叉编译 1 1 镜像来源 1 2 编译原理 1 3 编译过程 编辑 1 4 交叉编译 1 5 交叉编译工具链获取 2 ELF文件格式 编辑3 BIN文件格式 4 交叉编译工具链常用工具 4 1 size命令举例 4 2 rm命令
  • 算法(1)——双指针

    双指针 我们常见的双指针的形式有两种 一种是对撞指针 一种是快慢指针 对撞指针 一般用于顺序结构中 也称左右指针 1 对撞指针从两端向中间移动 一个指针从最左端开始 另一个从最右端开始 然后逐渐向中间逼近 2 对撞指针的终止条件一般是两个指