数组部分

数组最重要的思维方式是双指针的使用。

快慢指针

在进行元素移除和元素操作时会使用两个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 数组、链表复习的更多相关文章

  1. 代码随想录算法训练营day01 | leetcode 704/27

    前言   考研结束半个月了,自己也简单休整了一波,估了一下分,应该能进复试,但还是感觉不够托底.不管怎样,要把代码能力和八股捡起来了,正好看到卡哥有这个算法训练营,遂果断参加,为机试和日后求职打下一个 ...

  2. 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

    LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树 ...

  3. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 :https://leetcode.cn/problems/squares-of-a-sorted-array/ 心得:周末再写... public class Solutio ...

  4. 代码随想录算法训练营day03 | LeetCode 203/707/206

    基础知识 数据结构初始化 // 链表节点定义 public class ListNode { // 结点的值 int val; // 下一个结点 ListNode next; // 节点的构造函数(无 ...

  5. 代码随想录算法训练营day02 | leetcode 977/209/59

    leetcode 977   分析1.0:   要求对平方后的int排序,而给定数组中元素可正可负,一开始有思维误区,觉得最小值一定在0左右徘徊,但数据可能并不包含0:遂继续思考,发现元素分布有三种情 ...

  6. 代码随想录算法训练营day13

    基础知识 二叉树基础知识 二叉树多考察完全二叉树.满二叉树,可以分为链式存储和数组存储,父子兄弟访问方式也有所不同,遍历也分为了前中后序遍历和层次遍历 Java定义 public class Tree ...

  7. 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素

    基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...

  8. 代码随想录算法训练营day06 | leetcode 242、349 、202、1

    基础知识 哈希 常见的结构(不要忘记数组) 数组 set (集合) map(映射) 注意 哈希冲突 哈希函数 LeetCode 242 分析1.0 HashMap<Character, Inte ...

  9. 代码随想录算法训练营day04 | leetcode

    基础知识 记录一下栈实现及操作 public class ArrayDequeStack { public void main() { ArrayDeque stack = new ArrayDequ ...

  10. 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0  二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...

随机推荐

  1. 【LeetCode997】【哈希表】[Py/C#/Scala/Elixir/Kotlin/Rust/Ruby/Swift/PHP/Java/Go/C++/TS/Erlang/Racket/Dart] 一道统计入度出度的简单题目

    可以看到,一般而言,Python最接近"想思路时写的伪代码" 目录 解题思路 代码 python3 C# scala elixir kotlin rust ruby swift p ...

  2. 使用Mathematica做序列的DTFT的几个例子

    ListFourierSequenceTransform[{-2, -1, 1, 3, 3, 1, -1, -2}, \[Omega]] ParametricPlot[{Re[%], Im[%]}, ...

  3. Google Protobuf 编解码

    更多内容,前往个人博客 Protobuf 全称:Google Protocol Buffers,由谷歌开源而来,经谷歌内部测试使用.它将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成 ...

  4. 爬取网页的通用代码框架.py(亲测有效)

    import requests def getHTMLText(url): try: kv = {'user-agent':'Mozilla/5.0'} r = requests.get(url,he ...

  5. 人工智能机器学习底层原理剖析,人造神经元,您一定能看懂,通俗解释把AI“黑话”转化为“白话文”

    按照固有思维方式,人们总以为人工智能是一个莫测高深的行业,这个行业的人都是高智商人群,无论是写文章还是和人讲话,总是讳莫如深,接着就是蹦出一些"高级"词汇,什么"神经网络 ...

  6. 明解STM32—GPIO理论基础知识篇之寄存器原理

    ​ 一.前言 在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍.GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析:GPIO工作模式中主要介绍GPI ...

  7. python中的强制等待、隐性等待、显性等待

    运行结果过程中出现Unable to locate element时,1.先确定元素是否定位有误.2.再确定运行过程中是否等待不到位,可以截图,查看查找时页面的状态. 1.使用强制等待 --辅助 2. ...

  8. [Linux]Filesystem Hierarchy Standard/文件系统层次结构标准(FHS for Linux)

    1 文件系统层次结构标准 本篇文章为维基百科中关于FHS的译文,原文见 wiki:https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard ...

  9. [Linux]常用命令之【mount/umount】

    1 mount mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者. 在Linux和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分访问的. 要 ...

  10. DG:三种模式切换

    应用归档日志方式进行数据同步 SQL> alter system set log_archive_dest_2='SERVICE=standby arch noaffirm valid_for= ...