当前位置: 首页 > news >正文

算法(二)——数组章节和链表章节

数组章节

(1)二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

class Solution {public int search(int[] nums, int target) {//二分查找法int right=nums.length-1;int left=0;while(left<=right){int mid=(right+left)/2;if(target<nums[mid]){right=mid-1;}else if(target>nums[mid]){left=mid+1;}else{return mid;}}return -1;}
}

(2)双指针——移除元素

  • 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
  • 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
  • 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution {public int removeElement(int[] nums, int val) {//双指针(quick-遍历数组 slow-将不等于val的元素依次插入新数组)int slow=0;for(int quick=0;quick<nums.length;quick++){if(nums[quick]!=val){nums[slow]=nums[quick];slow++;}}return slow;   //slow指针指向空位,等待插入,所以slow值等于新数组长度}
}

(3)有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

class Solution {public int[] sortedSquares(int[] nums) {// 结果数组int n = nums.length;int[] result = new int[n];// 双指针int left = 0;int right = n - 1;while (left <= right) {if (Math.pow(nums[left], 2) >= Math.pow(nums[right], 2)) {result[n - 1] = (int) Math.pow(nums[left], 2);left++;} else {result[n - 1] = (int) Math.pow(nums[right], 2);right--;}n--;}return result;}
}

(4)长度最小的子数组

  • 给定一个含有 n 个正整数的数组和一个正整数 target 。
  • 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
class Solution {public int minSubArrayLen(int target, int[] nums) {int res = 2147483647;//整数最大值int len;int sum=0;int i=0;//i 为窗口开始位置,j 为窗口终止位置for(int j=i;j<nums.length;j++){sum+=nums[j];while(sum>=target){len=j-i+1;res=Math.min(len,res);sum-=nums[i++];//不断移动i,直到区间内的和< target}//跳出while循环后,遍历继续j,j指针重新与i指针合并}return res==2147483647? 0:res;//数组总和都达不到target,res没有改变}
}

(5)螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

class Solution {public List<Integer> spiralOrder(int[][] matrix) {//这个二维数组行列不确定List<Integer> result = new ArrayList<>();//matrix.length     行数//matrix[0].length  列数if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return result;}int rows = matrix.length;    //行int cols = matrix[0].length; //列//定义四个变量top、bottom、left、right,分别表示当前遍历的上边界、下边界、左边界和右边界。//初始时,上边界为0,下边界为行数减1,左边界为0,右边界为列数减1。int top = 0, bottom = rows - 1, left = 0, right = cols - 1;while (top <= bottom && left <= right) {// 从左到右if(right!=0){ //判断只有一列的情况for (int i = left; i <= right; i++) {result.add(matrix[top][i]);}top++;}// 从上到下if(bottom!=0){//判断只有一行的情况for (int i = top; i <= bottom; i++) {result.add(matrix[i][right]);}right--;}// 从右到左if (top <= bottom) {for (int i = right; i >= left; i--) {result.add(matrix[bottom][i]);}bottom--;}// 从下到上if (left <= right) {for (int i = bottom; i >= top; i--) {result.add(matrix[i][left]);}left++;}}return result;}
}

链表章节

(6)移除链表中的元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//该方法没有头结点public ListNode removeElements(ListNode head, int val) {// 处理头节点为需要删除的节点的情况while (head != null && head.val == val) {//这个while需要注意head = head.next;}// 处理链表为空的情况(你前面持续删除首结点,当然得判断链表是不是被你删空嘞)if (head == null) {return head;}// 遍历链表,删除节点ListNode cur = head;while (cur.next != null) {if (cur.next.val == val) {cur.next = cur.next.next;} else {cur = cur.next;}}return head;
}
}

(7)设计链表

定义一个双链表,并实现它的基本操作

 //双链表class ListNode{int val;ListNode next;ListNode prev;ListNode(){}ListNode(int val){this.val=val;}}
class MyLinkedList {//链表长度int size;//虚拟头结点ListNode head;public MyLinkedList() {size = 0;head = new ListNode(0);head.next = null;head.prev = null;}//根据索引查询并返回元素public int get(int index) {if (index < 0 || index >= size) {return -1;}ListNode curr = head;for (int i = 0; i <= index; i++) {curr = curr.next;}return curr.val;}//头插法public void addAtHead(int val) {ListNode newNode = new ListNode(val);newNode.next = head.next;newNode.prev = head;if (head.next != null) {head.next.prev = newNode;}head.next = newNode;size++;}//尾插法public void addAtTail(int val) {ListNode newNode = new ListNode(val);ListNode curr = head;while (curr.next != null) {curr = curr.next;}curr.next = newNode;newNode.prev = curr;size++;}//按索引添加新结点public void addAtIndex(int index, int val) {if (index < 0 || index > size) {return;}if (index == 0) {addAtHead(val);return;}if (index == size) {addAtTail(val);return;}ListNode newNode = new ListNode(val);ListNode curr = head;for (int i = 0; i < index; i++) {curr = curr.next;}newNode.next = curr.next;newNode.prev = curr;curr.next.prev = newNode;curr.next = newNode;size++;}//按索引删除结点public void deleteAtIndex(int index) {if (index < 0 || index >= size) {return;}ListNode curr = head;for (int i = 0; i < index; i++) {curr = curr.next;}curr.next = curr.next.next;if (curr.next != null) {curr.next.prev = curr;}size--;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/

(8)翻转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {//双链表ListNode cur=head;ListNode pre=null;ListNode temp=new ListNode();while(cur!=null){temp=cur.next;cur.next=pre;//这两步不能颠倒pre=cur;cur=temp;}return pre;}
}

(9)两两交换链表中的结点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {ListNode demo=new ListNode();//虚拟头结点demo.next=head;//让虚拟头结点指向head首结点ListNode cur=demo;//遍历指针ListNode first;//保存需要交换的第一个结点ListNode second;//保存需要交换的第二个结点ListNode temp;//临时变量存储结点//开始遍历while(cur.next!=null && cur.next.next!=null){//分别考虑链表长度为偶数和奇数情况first=cur.next;second=cur.next.next;//开始交换位置temp=cur.next.next.next;//保存第二组结点的第一个结点//开始交换cur.next=second;second.next=first;first.next=temp;//cur需要变到下一组的前面结点cur=first;//注意此时链表的顺序以及改变}return demo.next;}
}

(10)删除链表的倒数第n个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//虚拟头结点ListNode demo=new ListNode(-1);demo.next=head;//双指针法ListNode slow=demo;ListNode fast=demo;//fast首先走n + 1步 //因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作for (int i = 0; i < n  ; i++){fast=fast.next;}//双指针开始同步右移while(fast.next!=null){fast=fast.next;slow=slow.next;}//此时slow指针指向倒数第N+1个结点//开始删除slow.next=slow.next.next;//这里返回的是demo.next而不是head;return demo.next;}
}

(11)链表相交

"双指针法"具体步骤如下:

  1. 创建两个指针p1和p2,分别指向两个链表的头节点。
  2. 同时移动两个指针p1和p2,每次移动一个节点。
  3. 当其中一个指针到达链表末尾时(即指向null),将它指向另一个链表的头结点。
  4. 继续移动两个指针,直到它们相遇或者都指向null。
  5. 如果两个指针相遇,则说明两个链表有交点,返回该节点。
  6. 如果两个指针都指向null,则说明两个链表没有交点,返回null。
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headA==null || headB==null) return null;//双指针法ListNode p1=headA;ListNode p2=headB;//开始遍历while(p1!=p2){if(p1==null){p1=headB;}else{p1=p1.next;}if(p2==null){p2=headA;}else{p2=p2.next;}}return p1;}
}

(12)环型链表

在这里插入图片描述

  • 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
  • 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
  • 为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0开始)。
  • 如果 pos 是 -1,则在该链表中没有环。
  • 注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。
  • 不允许修改 链表。
/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {//数学题(追击问题)//有环必相遇//第一步:判断是否有环ListNode slow=head;ListNode fast=head;while(fast!=null && fast.next!=null){slow=slow.next;//一次移动一个结点fast=fast.next.next;//一次移动两个结点if(slow==fast){//有环//第一步:找环的第一个结点//根据公式,存在n=1,即快指针在第二圈途中与慢指针相遇,浪漫吗? 累成狗了,浪漫个屁。ListNode slowRecord=slow;//记录彼此的第一次邂逅,慢指针依旧原地开始走ListNode fastEx=head;//快指针回head首结点重新开始追while(slowRecord!=fastEx){//这回两人都得一步一步走,直到相遇,相遇点即为环入口slowRecord=slowRecord.next;fastEx=fastEx.next;}return slowRecord;}}//无环无缘喽return null;}
}

相关文章:

算法(二)——数组章节和链表章节

数组章节 &#xff08;1&#xff09;二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 class Solution {public i…...

Android:ListView在Fragment中的使用

一、前言&#xff1a; 因为工作一直在用mvvm框架&#xff0c;因此这篇文章是基于mvvm框架写的。在Fragment复制之前一定要谨记项目可以跑起来。确保能跑起来之后直接复制就行。 二、代码展示&#xff1a; 页面布局 ?xml version"1.0" encoding"utf-8"…...

BIGEMAP在土地规划中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 1.使用软件一般都用于套坐标&#xff0c;比如我们常见的&#xff08;kml shp CAD等土建规划图纸&#xff09;以及一些项目厂区红线&#xff0c;方便于项目选址和居民建…...

软件测试常见术语和名词解释

1. Unit testing (单元测试)&#xff1a;指一段代码的基本测试&#xff0c;其实际大小是未定的&#xff0c;通常是一个函数或子程序&#xff0c;一般由开发者执行。 2. Integration testing (集成测试)&#xff1a;被测试系统的所有组件都集成在一起&#xff0c;找出被测试系统…...

prometheus+process_exporter进程监控

一、需要监控进程的服务器上配置 1、进入到临时工作目录&#xff0c;传入process_exporter包 [root Nginx1 ~]# cd work/ [root Nginx1 work]# rz 2、解压&#xff0c;并移动至/usr/local/目录下 [root Nginx1 work]# tar xzf process-exporter-0.7.5.linux-amd64.tar.gz [root…...

四川玖璨电子商务有限公司专注抖音电商运营

四川玖璨电商是一个靠谱的抖音培训公司&#xff0c;在电商行业内有着广泛的知名度和良好的口碑。该公司通过多年的发展&#xff0c;形成了独特的运营理念和有效的运营策略&#xff0c;为商家提供了一站式的抖音电商运营服务。 首先&#xff0c;四川玖璨电子商务有限公司注重与…...

python LeetCode 刷题记录 83

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 代码 class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:if head:# 判断非空链表current he…...

Grom 如何解决 SQL 注入问题

什么是 SQL 注入 SQL 注入是一种常见的数据库攻击手段&#xff0c; SQL 注入漏洞也是网络世界中最普遍的漏洞之一。 SQL 注入就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常规代码的过程。 这个问题的来源就是&#xff0c; SQL 数据库的操作是通过 SQ…...

腾讯mini项目-【指标监控服务重构】2023-07-19

今日已办 OpenTelemetry Logs 通过日志记录 API 支持日志收集 集成现有的日志记录库和日志收集工具 Overview 日志记录 API - Logging API&#xff0c;允许您检测应用程序并生成结构化日志旨在与其他 telemerty data&#xff08;例如metric和trace&#xff09;配合使用&am…...

抖音矩阵系统源代码开发部署--SaaS开源技术开发文档

一、概述 抖音SEO矩阵系统源代码是一套针对抖音平台的搜索引擎优化工具&#xff0c;它可以帮助用户提高抖音视频在搜索结果中的排名&#xff0c;增加曝光率和流量。本开发文档旨在提供系统的功能框架、技术要求和开发示例&#xff0c;以便开发者进行二次开发和优化。 二、功能…...

CLIP模型资料学习

clip资料 links https://blog.csdn.net/wzk4869/article/details/129680734?ops_request_misc&request_id&biz_id102&utm_termCLIP&utm_mediumdistribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-129680734.142v94insert_down1&spm10…...

【c语言】贪吃蛇

当我们不想学习新知识的时候&#xff0c;并且特别无聊&#xff0c;就会突然先看看别人怎么写游戏的&#xff0c;今天给大家分享的是贪吃蛇&#xff0c;所需要的知识有结构体&#xff0c;枚举&#xff0c;以及easy-x图形库的一些基本函数就完全够用了&#xff0c;本来我想插入游…...

【Node.js】定时任务cron:

文章目录 一、文档&#xff1a;【Nodejs 插件】 二、安装与使用【1】安装【2】使用 三、cron表达式&#xff1a;{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}四、案例&#xff1a; 一、文档&#xff1a; 【说明文档】https://www.npmjs.com/package/cron 【Cron表…...

vue3 引入element-plus

1.首先安装element-plus npm install element-plus 2.main.js配置 ... import ElementPlus from element-plus import element-plus/theme-chalk/index.css; //导入图标 import * as ELementPlusIconsVue from "element-plus/icons-vue" ... app.use(ElementPlus) /…...

数据通信——传输层TCP(超时时间选择)

引言 TCP每一次发送报文段&#xff0c;就会对这个报文段设置一次计时器。如果时间到了却没有收到确认报文&#xff0c;那么就要重传该报文。 这个之前在TCP传输的机制中提到过&#xff0c;这个章节就来研究一下超时时间问题。 关于加权的概念 有必要提及一下加权的概念&#x…...

【数据库索引优化】

文章目录 数据库索引优化1. 选择合适的字段创建索引2. 限值每张表上的索引数量3. 被频繁更新的字段应该慎重建立索引4. 尽可能考虑简历联合索引而不是单列索引5. 避免冗余索引6. 字符串类型的字段使用前缀索引代替普通索引7. 避免索引失效8. 删除长期未使用的索引 数据库索引优…...

WebGL 选中物体

目录 前言 如何实现选中物体 示例程序&#xff08;PickObject.js&#xff09; 代码详解 gl.readPixels&#xff08;&#xff09;函数规范 示例效果 前言 有些三维应用程序需要允许用户能够交互地操纵三维物体&#xff0c;要这样做首先就得允许用户选中某个物体。对物体…...

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…...

PostgreSQL如何支持PL/Python过程语言

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;10.4 文档用途 本文档主要介绍PostgreSQL如何支持PL/Python过程语言&#xff0c;如何创建plpython扩展。 详细信息 一、PostgreSQL支持python语言…...

【C++】STL之适配器---用deque实现栈和队列

目录 前言 一、deque 1、deque 的原理介绍 2、deque 的底层结构 3、deque 的迭代器 4、deque 的优缺点 4.1、优点 4.2、缺点 二、stack 的介绍和使用 1、stack 的介绍 2、stack 的使用 3、stack 的模拟实现 三、queue 的介绍和使用 1、queue 的介绍 2、queue 的使用 3、qu…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...