数组总结【代码随想录】

一.数组

1.lc 27移除数组中的重复元素

且必须仅使用 O(1) 额外空间并 原地 修改输入数组

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案

public static int removeElement(int[] nums, int val) {int i = 0;int len = nums.length;while (i<len){if (nums[i]==val){nums[i] = nums[len-1];len--;}else {i++;}}return len;}

总结:直接输出移除指定元素后的数组长度是非常容易的,原地修改数组需要:如果第一个元素是指定的元素,那么我们将最后一个元素的值赋给第一个元素并且len指针往前移(逻辑上把指定元素删了,数组长度减1)。

2.lc977 有序数组的平方

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

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

public class Case977 {public static void main(String[] args) {int[] nums = {-4,-1,0,3,10};//返回数组内容的字符串表示形式System.out.println(Arrays.toString(sortedSquares(nums)));}public static int[] sortedSquares(int[] nums) {int len = nums.length;for (int i = 0; i < nums.length; i++) {nums[i] = (int) Math.pow(nums[i],2);}Arrays.sort(nums);return nums;}
}

总结:利用api快速解题,时间复杂度为O(nlogn)。再学一招:双指针!O(n) 思路:数组有序,那么数组元素平方后,最大值只可能在两边,不可能在中间,如{-5,-4,-3,-2,-1,0,1},所以可以用双指针进行解答。

public static int[] sortedSquares2(int[] nums) {int n = nums.length;int[]res = new int[n];int i = 0;int j = n-1;int k = n-1;while (i<=j){if (nums[i]*nums[i] < nums[j]*nums[j]){res[k--] = nums[j]*nums[j];j--;}else {res[k--] = nums[i]*nums[i];i++;}}return res;
}

3.lc209【middle】 求长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target的长度最小的连续子数组 并返回其长度,如果不存在符合条件的子数组,返回 0 。

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

思路1:暴力,是最容易想到的方法,但超时了。时间复杂度为O(n*n)

public static int minSubArrayLen(int target, int[] nums) {int min = Integer.MAX_VALUE;for (int i = 0; i < nums.length; i++) {int sum = nums[i];if (sum >= target) return 1;for (int j = i + 1; j < nums.length; j++) {sum += nums[j];if (sum >= target) {min = Math.min(min, j - i + 1);break; //发现符合情况的,没必要往后加了,直接跳出本次循环。}}}return min==Integer.MAX_VALUE ? 0:min;
}

思路2:滑动窗口。时间复杂度为O(n),这种滑动窗口的类型是先找到符合条件的子数组,如果找不到往后拓展窗口的长度,直到找到为止(可能>>target),后改变起始位置,缩小滑动窗口。

public static int minSubArrayLen2(int target, int[] nums) {int left = 0;int sum = 0;int res = Integer.MAX_VALUE;//j 表示的是滑动窗口的终止位置。那么起始位置需要我们自己去调。for (int right = 0; right <nums.length ; right++) {sum += nums[right];while (sum>=target){res = Math.min(res,right-left+1);sum-=nums[left++];}}return res==Integer.MAX_VALUE?0:res;
}

4.删除有序数组中的重复项。

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

public static int removeDuplicates(int[] nums) {int i = 0;for (int j = 1; j < nums.length; ) {if (nums[i]!=nums[j]){i++;nums[i] = nums[j];}else {j++;}}return i+1;
}

5.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

输入: nums = [1,3,5,6], target = 5
输出: 2

public static int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left<=right){int mid = (left+right)/2;if (nums[mid]<target){left = mid+1;}else if (nums[mid] >target){right = mid-1;}else {return mid;}
}
return left;
}

 思路:看见题目要求时间复杂度为O(logn)必然要想到二分查找!但前提是数组有序,接下来就是在二分查找模板的基础上进行改动!

6.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

 思路一:利用api,快速解题,时间复杂度为O((n+m)log(m+n))

public static void merge(int[] nums1, int m, int[] nums2, int n) {
//        for (int i = 0; i!=n ; i++) {
//            nums1[m+i] = nums2[i];
//        }System.arraycopy(nums2,0,nums1,m,n);Arrays.sort(nums1);

思路2:开辟一个一个辅助数组。时间复杂度O(n),空间复杂度O(n+m)。

public static void merge2(int[] nums1, int m, int[] nums2, int n) {int[]temp = new int[m];System.arraycopy(nums1,0,temp,0,m);//把nums1里面的元素,下标从0开始复制到temp里,下标从0开始,复制m个数。int p1 = 0;  //指向tempint p2 = 0;  //指向nums2int p = 0;   //指向nums1的开头while ((p1<m)&&(p2<n)){nums1[p++] = temp[p1]<nums2[p2] ? temp[p1++] : nums2[p2++];}if (p1<m) System.arraycopy(temp,p1,nums1,p1+p2,m+n-p1-p2);// 如果p1走完的时候,p2还没走完,则把nums2从下标为p2的元素全部复制到nums1,复制m+n-p1-p2个元素if (p2<n) System.arraycopy(nums2,p2,nums1,p1+p2,m+n-p1-p2); 
}
class Solution {public void merge(int[] A, int m, int[] B, int n) {for (int i = 0; i != n; ++i) {A[m + i] = B[i];}Arrays.sort(A);}
}

7.螺旋矩阵I [middle]

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

例如:

 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

思路:依次从左往右,从上到下,从右往左,从下往上依次遍历。

List<Integer> list = new ArrayList<>();
int left = 0;
int right = matrix[0].length-1; //列数
int up = 0;
int down = matrix.length-1;  //行数
while (true){//左——>右for (int j = left; j <=right ; j++) {list.add(matrix[up][j]);}//第一行遍历完毕,开始遍历下面。if (++up>down){break;}//从上往下for (int i = up; i <= down; i++) {list.add(matrix[i][right]);}if (--right<left){break;}//从右往左for (int j = right; j>=left ; j--) {list.add(matrix[down][j]);}if (--down<up){break;}//从下往上for (int i = down; i >=up ; i--) {list.add(matrix[i][left]);}if (++left>right){break;}
}
return list;
}

8.螺旋矩阵||

你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

 思路:与螺旋矩阵I 模板一模一样,无非定义一个变量num,初始值为1,在每个循环体里面自增。

9.返回数组中正整数数目与负整数数目中的最大值

给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 posneg二者中的最大值。

nums = [-3,-2,-1,0,0,1,2]
输出:3
解释:共有 2 个正整数和 3 个负整数。计数得到的最大值是 3 

public static int maximumCount(int[] nums) {int len = nums.length;int cntNeg = negNum(nums) + 1;int cntPos = len-posNum(nums);return Math.max(cntNeg, cntPos);
}private static int negNum(int[] nums) {//二分,求负数的个数。int i = 0;int j = nums.length - 1;while (i <= j) {int mid = (i + j) / 2;if (nums[mid] < 0) {i = mid + 1;} else {j = mid - 1;}}return j;
}
private static int posNum(int[] nums) {//二分,求负数和0的个数。int i = 0;int j = nums.length - 1;while (i <= j) {int mid = (i + j) / 2;if (nums[mid] >=1 ) {j = mid - 1;} else {i = mid+1;}}return i;
}

10.区间和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24778.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型训练——pycharm连接实验室服务器

一、引言 我们在运行或者复现大佬论文代码的时候&#xff0c;笔记本的算力不够&#xff0c;需要使用实验室的服务器进行运行。可以直接在服务器的终端上执行&#xff0c;但是这样的话代码调试就不方便。而我们可以使用 pycharm 连接到服务器&#xff0c;既方便了代码调试&…

STM32的C语言软件延时函数

STM32的延时方法很多&#xff0c;其中采用定时器延时&#xff0c;可以得到较为精确的延时&#xff0c;但是有时对延时精度要求不高的场合&#xff0c;采用软件延时&#xff0c;也是必须的。特别是在RTOS系统中&#xff0c;使用SysTick的普通计数模式对延迟进行管理&#xff0c;…

前端网页或者pwa如何实现只横屏显示,设备竖着的时候依然保持横屏

开发的时候&#xff0c;就是以横屏的样式开发的&#xff0c;所以横屏的展示效果就是&#xff1a; 当设备竖着的时候&#xff0c;会进行缩放&#xff0c;展示效果不友好&#xff0c;所以需要设备竖着的时候&#xff0c;也横屏显示&#xff1a; 实现原理就是&#xff1a;使用css监…

计算机毕业设计SpringBoot+Vue.js电影评论网站系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Locale+Jackson导致Controller接口StackOverflowError异常解决

问题 由于参与的项目有出海需求&#xff0c;即需要给外国人使用&#xff0c;即&#xff1a;需要支持i18n&#xff08;Internationalization的缩写&#xff0c;共20个字母&#xff0c;除去首尾两个字母&#xff0c;中间有18个&#xff0c;故简称i18n&#xff09;。 本来是好的…

Graph and GNN——图的表示与图神经网络的介绍与应用

Hi&#xff0c;大家好&#xff0c;我是半亩花海。细数日子已然有很长一段时间没有更新博客了&#xff0c;不是在忙东忙西&#xff0c;就是在玩这玩那&#xff0c;在家摆&#xff0c;在学校gap&#xff0c;无敌了。言归正传&#xff0c;今天暂且先进一步探索并整理一部分图神经网…

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…

Https解决了Http的哪些问题

部分内容来源&#xff1a;小林coding 详细解析 Http的风险 HTTP 由于是明文传输&#xff0c;所以安全上存在以下三个风险&#xff1a; 1.窃听风险 比如通信链路上可以获取通信内容&#xff0c;用户号容易没。 2.篡改风险 比如强制植入垃圾广告&#xff0c;视觉污染&#…

GO 进行编译时插桩,实现零码注入

Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术&#xff0c;目的是在不修改业务代码的情况下&#xff0c;实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改&#xff0c;将监控代码注入到…

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字&#xff0c;然后转换为张量&#xff0c;成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型&#xff0c;重要的是使用与之关联的…

应用的负载均衡

概述 负载均衡&#xff08;Load Balancing&#xff09; 调度后方的多台机器&#xff0c;以统一的接口对外提供服务&#xff0c;承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中&#xff0c;我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手&#xff0c;但是需要运行Py脚本&#xff0c;还比较麻烦&#xff0c;下面我们用C#依据Ollama提供的API接口开发一个本地A…

springboot+dubbo+zookeeper的注册服务和调用实践

目录 zookeeper为什么可作为注册中心zookeeper注册中心优缺点启动zookeeper编写springboot项目提供dubbo服务1. 服务接口2. Springboot引入dubbo实现服务接口2.1 工程目录和依赖2.2 启动程序和application.properties2.3 DubboService 实现服务接口2.4 测试api&#xff0c;用于…

NL2SQL的应用-长上下文模型在处理NL2SQL任务时,相较于传统模型,有哪些显著的优势

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下NL2SQL的应用-长上下文模型在处理NL2SQL任务时&#xff0c;相较于传统模型&#xff0c;有哪些显著的优势。NL2SQL&#xff08;自然语言转SQL&#xff09;技术旨在将用户自然语言提问自动转换为结构化查询语句&#…

A Large Recurrent Action Model: xLSTM Enables Fast Inference for Robotics Tasks

奥地利林茨约翰开普勒大学机器学习研究所 ELLIS 小组&#xff0c;LIT 人工智能实验室奥地利林茨 NXAI 有限公司谷歌 DeepMind米拉 - 魁北克人工智能研究所 摘要 近年来&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;领域出现了一种趋势&#xff0c;…

DeepSeek本地部署+自主开发对话Web应用

文章目录 引言前端部分核心页面DeepSeek.vueMyModal.vue 后端部分WebSocketConfig 配置类AbstractDeepSeekToolDeepSeekWebSocketHandler 数据库设计总结 引言 最近DeepSeep横空出世&#xff0c;在全球内掀起一股热潮&#xff0c;到处都是满血大模型接入的应用&#xff0c;但这…

DMA 定制固件教程:小白跟做即得单人固件,超详细纯喂饭教程,100% 成功秘籍!FPGA仿真1:1、中断逻辑和TLP核心都在。

DMA 定制固件教程 小白跟着操作做可以做出的单人固件 图文教程 链接&#xff1a;https://docs.qq.com/doc/DQ01lVGtHelROVHNv 本图文教程包含内容&#xff1a; 一、DMA仿真技术采集真实单人固件 二、网卡TLP仿真固件生成 三、DMA仿真技术io、中断逻辑&#xff0c;从零仿真 四、…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注&#xff1a;本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文&#xff0c;机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…