数组-链表


感谢代码随想录

1. 数组

1.1. 滑动窗口

不断调整起始位置和终止位置,处理一块区间内的数据。

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。确定好移动的情况,并处理需要优先移动窗口还是先处理窗口中的数据。

滑动窗口

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

1.2. 螺旋数组

确定边界处理的不变量,确保每个子问题的结构都是相同的

然后按照不变量写出每次循环的次数

循环数组

1.3. 删除链表

删除倒数第n值

删除列表时,最好增加dummy_head节点,删掉头节点更方便

增加dummy-head

1.4. 链表相交

返回相交链表节点

img

  1. 求A,B的长度$l_A,l_B$
  2. 为方便起见,将A始终未较长链表,否则将A,B交换
  3. 根据$l_A,l_B$ 的差值,将长端链表对齐
  4. 依次比较

1.5. 环形链表

20220925103433

$$
slow = x+y \
fast = x+y+n(y+z) \
fast = 2slow
$$
计算得到
$$
x = (n-1)(y+z)+z
$$
代表,*从头节点走向环形入口 = 从相遇点出发走n个节点

// 先向前走再进行验证,否则第一个就相等了

1.6. 前缀和

将之间计算的结果累加保存在数据中,之后使用时使用结算完成的数组

需要更具题目要求,选择计算什么样的前缀数组

 while (~scanf("%d%d", &a, &b))//按位取反,如果结果是eof=-1,取反之后结果为0

1.7. 哈希表

1.7.1. 数组作为哈希表

1.7.2. stl中的哈希表

此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构:

  • std::set
  • std::multiset
  • std::unordered_set

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

1.8. 回溯算法

算法的模板

void backtracking(参数){
    if(终止条件){
        存放结果;
           return;
    }
    for(选择:本层集合中的元素){
        处理节点;
        backtracking(路径, 选择列表); //递归
        回溯,撤销处理结果;
    }
}

vector a

a.push_back(int b) 压入数据, a.pop_back(), 弹出数据

还可以采用insert, + ,压入数据,使用erase(begin()+ i ,end())弹出数据

使用切割时候,需要注意下一次开始为本次切割后的下一次位置,此处回溯时候不需要还原,其余元素均需要还原。还原时候注意还原的位置。

回溯问题

1.8.1. 分割字符串方法

  1. 函数传递,参数s + start + end
  2. 使用string 切割,string s = s.substr(start, end)

1.8.2. 两阶vector初始化方法

is_palind_rome.resize(s.size(), vector<bool>(s.size(), false));

2. 感谢

代码随想录


文章作者: 小白菜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小白菜 !
评论
  目录