【算法专题训练】06、数组&双指针

1、数组

  • 数组是由相同类型的元素组成的数据集合,并且占据一块连续的内存,按照顺序存储数据。

1.1、数组的特性:

  • 数组元素通过下标获取数据
  • 数组对象初始化时,需要先指定数组容量大小,并根据容量大小分配内存。
  • 缺点:需要为所有的数据预先分配内存,可能存在空闲的区域没有得到充分利用。

1.2、动态数组

  • 先为数组分配较小的内存空间,然后在需要的时候,在数组中添加新的数据。
  • 当容量不足时,需要重新分配一块更大的空间,要把之前的数据复制到新的数组中,再把之前的内存释放。
  • 缺点:数据拷贝时,需要进行大量的额外操作。

2、指针

  • 能定位数据容器中(也就是内存中)某个数据的手段。也就是数据的句柄或者地址。

2.1、双指针

  • 双指针是一种解题方法
  • 方向相反的双指针经常用来求排序数组中的两个数字之和。通常分别指向数组的首位两端,根据结果值对两端的指针进行向中间移动。
  • 方向相同的双指针通常用来求正数数组中子数组的和或乘积。

3、LCR 006 两数之和

3.1、题目信息:

  • https://leetcode.cn/problems/kLl5u1/description/
给定一个已按照 升序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
 
示例 1:
输入:numbers = [1,2,4,6,10], target = 8
输出:[1,3]
解释:26 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。

示例 2:
输入:numbers = [2,3,4], target = 6
输出:[0,2]

示例 3:
输入:numbers = [-1,0], target = -1
输出:[0,1]

3.2、解题思路

  • 输入一个整数数组和一个目标整数,要求从数组中找出两个数,要求他们的和等于目标整数,返回两个元素的下标数组

1)、暴力解法

  • 双层for循环,遍历数组获得整数元素,然后遍历其他元素,判断他们的和是否等于目标值
  • 时间复杂度n的平方,没有使用到数组元素是升序排序的特性
  • 代码简单,不实现

2)、哈希表解法

  • 遍历数组元素,遍历的过程中,判断目标值与遍历元素的差值,判断差值是否在哈希表中,如果存在则返回下标数组
  • 如果不存在,则将当前遍历的元素和下标值,保存到哈希表中
vector<int> twoSum(vector<int> &numbers, int target)
{
    vector<int> res;
    std::map<int, int> map;
    for (int i = 0; i < numbers.size(); i++)
    {
        int num = target - numbers[i];
        if (map.find(num) != map.end()) // 存在,取出下标值
        {
            res.push_back(map[num]);
            res.push_back(i);
            break;
        }
        map[numbers[i]] = i;
    }
    return res;
}

3)、双指针解法

  • 定义两个下标,从数组的两端开始往中间遍历
  • 如果遍历到的两个元素的和等于目标值,则直接返回,如果两元素和大于目标值,则right角标左移,否则left角标右移
vector<int> twoSum(vector<int> &numbers, int target)
{
    vector<int> res;
    int left = 0;
    int right = numbers.size() - 1;
    while (left < right && target != (numbers[left] + numbers[right]))
    {
        if (numbers[left] + numbers[right] < target)
        {
            left++;
        }
        else
        {
            right--;
        }
    }
    res.push_back(left);
    res.push_back(right);

    return res;
}

4、总结

  • 数组特性,具有相同数据类型的数据集合,在内存中按顺序连续存储,数组对象就是数据的指针,可通过下标获取到数组中元素的值
  • 数组优缺点:可通过数组索引下标直接获取元素值,在数组尾部添加数据,插入与删除数据需要进行数据移动; 数组使用前需要预先分配内存,有可能有些内存没有使用到。
  • 动态内存,刚开始分配一个小容量的内存,当数据量增加时进行扩容,需要将原数据拷贝到新的数组中。
  • 指针概念,就是可以从内存中获取数据的方式
  • 双指针,是一种解题思路,分为相向指针和相反指针。
  • map数据结构使用,查找是否存在某个值使用find方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值