代码随想录算法训练营Day5 数组、链表复习
数组部分
数组最重要的思维方式是双指针的使用。
快慢指针
在进行元素移除和元素操作时会使用两个for循环嵌套,此时时间复杂度为O(n²)。在for循环中通过双指针(快慢指针)的使用可以使时间复杂度将为O(n)。
快慢双指针的定义:
int slowIndex=0;int fastIndex=0;
for(fastIndex=0;fastIndex<nums.size();fastIndex++){
}
相向双指针
在进行元素移除操作时,如果采用相向双指针的操作,可以基于元素顺序改变元素的相对位置,确保了移动最少元素。
相向双指针的定义:
int leftIndex=0;
int rightIndex=nums.size()-1;//定义的时Index下标,所以要size()-1
while(leftIndex<=rightIndex){
while(leftIndex<=rightIndex&&nums[leftIndex]!=val){//找左边等于val的元素
++leftIndex;
}
while(rightIndex>=leftIndex&&nums[rightIndex==val){//找右边不等于val的元素
--rightIndex;
}
if(leftIndex<rightIndex){//将右边不等于val的元素覆盖左边等于val的元素
nums[leftIndex++]=nums[rightIndex--];
}
}
滑动窗口
在双指针移动过程中主要关注两指针中间的元素值之和时,即可成为滑动窗口问题,滑动窗口的关键在于窗口初始、终止位置的移动。
代码实现:
while(sum>=s){
subLength=(j-i+1);//取子序列的长度
result=result<subLength?result:sublength;//比较result和subLength的长度,当a<b?为1时,result = result,为0时,result=sbuLength
sum-=nums[i++];//这里体现滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}
注意:※ c=a<b?a:b 是三元运算符,是将ab中较小的值赋给c,等同于
if(a<b){c=a;}
else {c=b;}
螺旋矩阵
螺旋矩阵的实现只能通过4个for循环进行模拟实现,处理规则为循环不变量,在最外层通过while控制每圈的循环,在每层内通过for进行每行、列的赋值。每列的取值是左开右闭区间。

链表部分
链表是由指针串联在一起的线性结构,每个节点由一个数据域和一个指针域组成。
设计链表
设计链表是leetCode中对链表整理最丰富的题目
定义链表结构体:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){}
};
初始化链表:
MyLinkList(){
_dummyNode=new LinkedNode(0);//初始化虚拟头节点
_size=0;
}
获取第index个节点数值,如果是非法则返回-1,第0个是头节点
get:
int get(int index){
if(index>(_size -1)||index<0){
retrun-1;
}
LinkNode* cur=_dummyHead->next;//定义一个新的节点为虚拟头节点的下一个
while(index--){
cur=cur->next;
}
return cur->val;
}
在链表前插入节点,插入后的节点为新的头节点
void addAtHead(int val){
LinkedNode* newNode=new LinkedNode(val);
newNode->next=_dummyHead->next;
_dummyHead->next=newNode;
_size++;
}
在链表后加一个节点
void addAtTail(int val){
LinkNode* newNode=new LinkedNode(val);
newNode->next=_dummyNead->next;
_dummyHead->next=newNode;
_size++;
}
在第index个节点前插入新节点,如果index等于链表长度,说明新节点为链表尾节点;index大于链表长度,则返回空;index小于0,则在头部插入节点
void addIndex(int index,int val){
if(index>_size) return;
if(index<0) index=0;
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur=_dummyHead;
while(index--){
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
_size++;
}
删除第index个基点,如果index大于等于链表的长度,直接return,index是从0开始
void deleteAtIndex(int index){
if(index>=_size||index<0){
return;
}
LinkedNode* cur=_dummyHead;
while(index--){
cur=cur->next;
}
LinedNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
_size--;
}
打印链表
void printLinkedList(){
LinkedNode* cur=_cummyHead;
while(vur->next!=nullptr){
.cout<<cur->next->val<<".";
vur=cur->next;
}
cout<<endl;
}
链表的虚拟头节点
虚拟头节点是链表操作中非常重要的方法
虚拟头节点的建立:
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;//虚拟头节点指向head,方便后续删除操作
链表的域表示
head->val是指head节点的val(data)值域
head->next是指head节点的next 指针域
head->next->next是指head节点后面的第二个节点,head->next是后面第一个
C++语言的基本知识
交换语法
swap(a,b)交换a、b,时间复杂度为O(nlog2n)
三元运算符
※ c=a<b?a:b 是三元运算符,是将ab中较小的值赋给c,等同于
if(a<b){c=a;}
else {c=b;}
C++语言规范
#include<iostream>
using namespace std;
int main(){}
vector容器(可用于定义数组)
#inlude<vector>
using namespace std;
int main(){
vector<int>& a;
}
代码随想录算法训练营Day5 数组、链表复习的更多相关文章
- 代码随想录算法训练营day01 | leetcode 704/27
前言 考研结束半个月了,自己也简单休整了一波,估了一下分,应该能进复试,但还是感觉不够托底.不管怎样,要把代码能力和八股捡起来了,正好看到卡哥有这个算法训练营,遂果断参加,为机试和日后求职打下一个 ...
- 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树 ...
- 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
977.有序数组的平方 :https://leetcode.cn/problems/squares-of-a-sorted-array/ 心得:周末再写... public class Solutio ...
- 代码随想录算法训练营day03 | LeetCode 203/707/206
基础知识 数据结构初始化 // 链表节点定义 public class ListNode { // 结点的值 int val; // 下一个结点 ListNode next; // 节点的构造函数(无 ...
- 代码随想录算法训练营day02 | leetcode 977/209/59
leetcode 977 分析1.0: 要求对平方后的int排序,而给定数组中元素可正可负,一开始有思维误区,觉得最小值一定在0左右徘徊,但数据可能并不包含0:遂继续思考,发现元素分布有三种情 ...
- 代码随想录算法训练营day13
基础知识 二叉树基础知识 二叉树多考察完全二叉树.满二叉树,可以分为链式存储和数组存储,父子兄弟访问方式也有所不同,遍历也分为了前中后序遍历和层次遍历 Java定义 public class Tree ...
- 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素
基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...
- 代码随想录算法训练营day06 | leetcode 242、349 、202、1
基础知识 哈希 常见的结构(不要忘记数组) 数组 set (集合) map(映射) 注意 哈希冲突 哈希函数 LeetCode 242 分析1.0 HashMap<Character, Inte ...
- 代码随想录算法训练营day04 | leetcode
基础知识 记录一下栈实现及操作 public class ArrayDequeStack { public void main() { ArrayDeque stack = new ArrayDequ ...
- 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0 二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...
随机推荐
- 《程序员的自我修养》学习笔记——ELF 文件结构介绍【第二弹】
ELF 文件结构介绍 文件头 以 ELF 文件64位版本为例: e_ident [ELF魔数 16byte] 1-4字节:ELF 文件都必须相同的标识码,分别为 0x7F,0x45,0x4C,0x46 ...
- 关于 manacher 的一个小细节
在该算法中,我们需要用到一个数组 hw[i] ,代表 i 的最大回文半径.而且这个半径不包括 i 本身(若串为 ccc 则 hw 为 1). 这时最终答案为最大的 hw 减一. 为什么要减一呢?最终的 ...
- SQL server分页的三种方法
一.Entity Framework的Linq语句的分页写法: var datacount = test.OrderBy(t => t.testID) .Skip(pageSize * (pag ...
- SQL Server底层架构技术对比
背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...
- stm32的学习笔记1
一 目录结构管理 Libraries是放官方固件库的 MDK-ARM是放产生的文件的,工程存放的目录 USERS是放自己写的代码的 然后是一个解释文件README 在MDK-ARM目录里还要创建两个文 ...
- VUE插值语法
目录 基本使用 基本使用 在body中创建一个标签,一般使用div,定义好id后,在script中进行定义,在前台使用{{变量}}的形式进行调用,语法如下: <!DOCTYPE html> ...
- python之wypy入门
wxPython入门 第一个应用程序:"Hello, World!" 按惯例,我们先来写一个 "Hello, World!" 小程序.这是代码: # -*- c ...
- day26:装饰器&面向对象当中的方法&property
目录 1.装饰器 1.1 装饰器的基本用法 1.2 @符号的使用 1.3 装饰器的嵌套 1.4 用装饰器扩展带有参数的原函数 1.5 用装饰器扩展带有参数和返回值的原函数 1.6 用类装饰器扩展原函数 ...
- 手把手逐步解析Javaweb登录实例
一.编写前端界面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 5221. 【GDOI2018模拟7.10】A
题目大意: 给你一棵有根树,问你在这棵树上总共有多少棵子树的节点构成了一个完整的整数区间. 考试想法: 考试时就想到了正解,正解就是从下到上遍历整一棵树,每一个节点记录一下它的最小值min.最大值ma ...