代码随想录算法训练营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 ...
随机推荐
- Go内存管理逃逸分析
1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定. 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆 ...
- fortify Unsafe JNI
Unsafe JNI 主要解决问题: 1.system.currentTimeMillis(); 使用SystemClock.now()替换. 2.isAssignableFrom(); 使用新定义的 ...
- 如何自动化测试你的接口?—— Rest Assured
前言 不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的.由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口测试方案.那么在本文中,我将探索如何使用 Rest A ...
- Pycharm 搭建 Django 项目
1. 安装需求 在使用 python 框架 Django 需要注意下面事项 Pycharm 版本是专业版而不是社区版本 Pycharm 配置好了 python 解释器 (一般我们现在用的都是pytho ...
- 自学UI设计有哪些书籍推荐?
自学UI设计大致分为两种情况:其一.业余学习,技能拓展,不以求职为目的;其二.谋生手段,小白进阶学习或者有转行的打算.前者,无论是学习内容或者深度都可以根据自己的需求和兴趣点来做学习选择,相对来说,学 ...
- Solon2 接口开发: 分布式 Api Gateway 开发预览
建议使用专业的分布式网关产品,比如: nginx apisix [推荐] k8s ingress controller 等... 对 Solon 来讲,只有 Gateway:它调用本地接口时,则为本地 ...
- xcodebuild命令行工具使用详解
xcodebuild命令行工具使用 如何通过命令行编译ios项目? xcodebuild是一个命令行工具,允许你从命令行对Xcode项目和工作区执行编译.查询.分析.测试和归档操作.它对项目中包含的一 ...
- CentOS 落幕,将于2021年底结束维护
官方最新消息: 译文: CentOS项目的未来是CentOS Stream,明年,我们将把重点从重建Red Hat Enterprise Linux(RHEL)的CentOS Linux转移到Cent ...
- [网络]内网IP的判别与分类
1 内网IP划分 内网IP地址分为A类.B类和C类,其地址范围如下: A类地址: 10.0.0.0 - 10.255.255.255 B类地址: 172.16.0.0 - 172.31.255.255 ...
- 这样也行,在lambda表达式中优雅的处理checked exception
目录 简介 lambda表达式中的checked exception lambda中的unchecked exception 对lambda的最终改造 总结 简介 最近发现很多小伙伴还不知道如何在la ...