ACM算法学习
文章平均质量分 54
算法学习与题解
xiongyuqing
看见我请叫我学英语
展开
-
203. 移除链表元素
如果next指向节点的值是val则说明,这个指向的节点需要跳过,所以返回的是next的next,如果不是val,则返回next指向的本身。对于不是最后一个节点的,它的next等于下面一个return 返回的值,而返回的值由next指向的节点的值决定。注意:这里的head是指向第一个节点的(首元节点),并没有一个虚拟的头节点,所以这让删除节点元素变得有些麻烦。我们创建一个新的头节点的头节点preHead,preHead指向真正的节点 head,这样便于删除元素。原创 2023-12-13 20:10:19 · 385 阅读 · 0 评论 -
59. 螺旋矩阵 II
每次只走一步判断下一步是否为临界值,如果是,按照预定的的四个方向的顺序进行转变一个巧妙的点:通过判断下一步是否有值来确定是否是边界,就可以不用记录已走过的边界框。原创 2023-12-13 17:21:06 · 369 阅读 · 0 评论 -
209. 长度最小的子数组
由于前缀和是不断递增的,满足二分查找的条件,所以我们只需要找到一个索引最小的右端点,使得左右端点之间的元素和大于等于target。当元素和的大小大于等于目标值时,判断能否在保证元素和大于目标值的同时,移动左指针前进。但是如果我们只枚举左端点,右端点使用二分查找的方式,复杂度为。注意边界:如果所有元素的和都小于目标值,则区间不存在,返回0。计算当前这种左右区间的长度,更新最小区间长度的答案。一个简单的想法是枚举区间的左右端点,这样复杂度是。右指针不断的前进,计算两个指针之间的元素和。原创 2023-12-13 15:16:07 · 393 阅读 · 0 评论 -
977. 有序数组的平方
对于两个有序数组的合并,可以利用类似归并排序的思想,为两个数组的最小位置各自分配一个指针。一个包含正负数的非递减数组,等同于一个从正负数分割线开始的两个有序正负数组。只需要在左右边界最高点的地方分配两根指针,逐渐向中心移动。根据数组特性,这是一个凹下去的数组,类似一元二次函数。原创 2023-12-13 11:32:32 · 350 阅读 · 0 评论 -
27. 移除元素
https://leetcode.cn/problems/remove-element/description/将后面所有不等于val的元素向前赋值移动弊端:大量不等于val的元素会被重复赋值方法二:双指针左右两个指针分别向中间移动如果左指针指向的元素是val,则将右指针指向的元素覆盖左边的元素,同时当前右指针指向的元素就不可用了,所以右指针向左移动一位如果左指针指向的元素不是val,则保留这个元素,左指针向右移动注意的是:最后边界条件的判断,最后左右指针必须重合指向同一个元素,才能保证长度计算正确我原创 2023-12-13 10:22:36 · 324 阅读 · 0 评论 -
牛客网|面试必刷TOP101
BM42 用两个栈实现队列_牛客题霸_牛客网 (nowcoder.com)由于栈是先进后出,队列是先进先出的,所以需要两个栈来倒来倒去将数据都push进入 stack1,pop的时候将stack1 中的数据倒入 stack2 中,再将数据pop出来,再把stack2的数据倒入stack1中class Solution{public: void push(int node) { stack1.push(node); } int pop() {原创 2022-03-16 21:33:10 · 889 阅读 · 0 评论 -
数据结构基础-单调队列
单调队列 - xiongyuqing - 博客园 (cnblogs.com)字面意思:队列是单调的,根据题目要求队列保持单调减或单调增,用以优化某种问题如果我们要求每一个滑动窗口内的最大值和最小值,对于一个长度为 n 的序列,窗口大小为 k 来说,暴力做法为:枚举每一个窗口,遍历每一个窗口的值取最大值或最小值for(int i = k - 1; i < n; ++ i){ ans = a[i]; for(int j = i; j > i - k; --j)原创 2021-08-04 17:51:43 · 169 阅读 · 0 评论 -
数据结构基础-单调栈
单调栈 - xiongyuqing - 博客园 (cnblogs.com)字面意思上理解,栈内元素是单调的,根据题目要求可能是单调递增或递减的对于一个长度为 n 的序列,如果要求左边第一个比 x 小的数暴力做法:for(int i = 0; i < n; ++ i){ for(int j = i - 1; j >= 0; --j) { if(a[j] < a[i]) { ...; b原创 2021-08-04 08:43:41 · 114 阅读 · 0 评论 -
数据结构基础-栈
栈 - xiongyuqing - 博客园 (cnblogs.com)模拟栈栈的特点:先进后出数组模拟栈的方法:tt 指针指向栈顶插入:tt 指针++弹出:tt 指针–判断栈空:tt == 0 ?询问栈顶元素:stk[tt]例题828. 模拟栈 - AcWing题库#include <iostream>#include <string>using namespace std;const int N = 1e5 + 5;int stk[N], tt;原创 2021-08-03 19:34:56 · 206 阅读 · 0 评论 -
数据结构基础-单链表
单链表 - xiongyuqing - 博客园 (cnblogs.com)单链表采用动态链表的方式:struct Node{ int val; Node *next;}new Node(); // 非常慢会非常慢,在算法竞赛中常常采用数组模拟链表,也叫静态链表head:表示头节点下标e[N]: 每个节点的值ne[N]:每个节点的下一个节点编号(下标)例如下面的链表:初始化// head:表示头节点的下标// e[i]: 表示第i个节点的值// ne[i]:原创 2021-08-02 22:12:48 · 208 阅读 · 0 评论 -
数据结构基础-双链表
每个节点有两个指针,一个指向下一个节点,一个指向前一个节点。在代码实现中使用左节点,右节点描述初始化e[N]:表示节点的值l[N]:表示左指针指向的节点r[N]:表示右指针指向的节点idx:已经使用过的节点编号(当前正在访问的节点编号)0 号点是头节点head1 号点是尾节点tailint e[N], l[N], r[N], idx;// 初始化void init(){ // 0 表示左端点,1表示右端点 r[0] = 1; l[1] = 0; idx =原创 2021-08-02 22:08:03 · 279 阅读 · 0 评论