数组部分

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

快慢指针

在进行元素移除和元素操作时会使用两个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. 我用 Laf 三分钟写了一个专属 ChatGPT ,Laf 创始人:明天来上班!

    起因 故事是这样的,一个月黑风高的夜晚,我掏出手机像往常一样打开朋友圈. 一开始我是不相信的,直到我(快速的) --> 打开 laf --> 创建应用 --> 新建云函数 --> ...

  2. 开源不易、安全慎行,中国软件如何走向文明?丨RTE 技术环境月报 202205

    各位开发者小伙伴: 这里是 2022 年第 5 期的 RTE<技术环境月报>--致力于成为对大家"有用"的 Highlight 看板--每月初通过 RTC 开发者社区( ...

  3. 基于.Net开发的、支持多平台、多语言餐厅点餐系统

    今天给大家推荐一套支持多平台.多语言版本的订单系统,适合餐厅.酒店等场景. 项目简介 这是基于.Net Framework开发的,支持手机.平板.PC等平台.多语言版本开源的点餐系统,非常适合餐厅.便 ...

  4. Prometheus Alertmanager生产配置趟过的坑总结

    简介 Alertmanager 处理由客户端应用程序(如 Prometheus server)发送的警报.它负责去重(deduplicating),分组(grouping),并将它们路由(routin ...

  5. ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler 功能详解

    SimpleChannelInboundHandler [类的关系]:如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAd ...

  6. IP代理的使用 IP代理爬取视频

    IP代理的使用 IP代理的分类 透明代理:目标网址知道你使用了代理并且知道你的源IP地址 匿名代理:匿名程序比较低 也就是网站知道你使用代理 但是查不出来源IP地址 高匿代理:网站不知道你使用了代理 ...

  7. 原生请求 js、jquery封装的ajax请求、axios请求与fetch请求区别与优缺点

    原生JS请求 现代浏览器,最开始与服务器交换数据,都是通过XMLHttpRequest对象.它可以使用JSON.XML.HTML和text文本等格式发送和接收数据. 首先我们先把原生的请求封装一下: ...

  8. vue中使用西瓜视频中引入自定义样式,绝对可以

    首先配置sass-loader和raw-loader 方法,再vue-config.js中加上这一段代码 module.exports = { chainWebpack: config => { ...

  9. Oracle_表空间

    Oracle 表空间 在执行具体的操作之前,由于Oracle不允许删除现有临时表空间,所以在删除现有临时表空间时要终止现有的实时会话. 查询Oracle表空间名称,表空间物理文件路径 查询临时表空间: ...

  10. 刷爆 LeetCode 周赛 339,贪心 / 排序 / 拓扑排序 / 平衡二叉树

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 339 场周赛,你参加了吗?这场周赛覆盖的知识点比较少, ...