一文读懂:什么是数组

news/2024/9/23 7:31:08/

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

什么是数组

Java是一种面向对象的编程语言,提供了许多数据结构来处理和组织数据。其中,数组是一种常见且强大的数据结构,是存放在连续内存空间上的相同类型数据的集合

数组可以通过下标访问到数组中的值,数组下标从0开始。

在这里插入图片描述

注意点:

  1. 数组下标从0开始
  2. 数组内存空间的地址是连续的
  3. 数组的元素是不能删的,只能覆盖。

因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。

例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示:

在这里插入图片描述

二维数组

例如:

int[][] rating = new int[3][4];

二位数组不是一个3*4的连续数组,但是是一组组连续的数组,如下图所示:

在这里插入图片描述

学习总结:

数组常见类型的算法考察:

1. 二分法

正因为数组是连续的内存空间,所以当存在一组数组是连续的,递增或者递减,都可以使用二分查找来找出目标值,读者可以看看笔者写的二分查找法,需要注意左右闭合区间取舍。

示例代码:

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;// 定义区间 【left,right】while(left <= right) {// 计算中间位置,防止溢出,用减法int middle = left + (right - left) / 2;if(nums[middle] > target) {// 目标值小于中间值,在左边right = middle - 1;} else if (nums[middle] < target) {// 目标值大于中间值,在右边left = middle + 1;} else {// 刚好等于中间值,returnreturn  middle;}}return -1;}
}

2. 双指针法

因为数组大小一旦定义,就无法改变,只能覆盖,数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。

所以在需要移除数组中的对象这类问题时,可以考虑双指针去处理,使用一个快慢指针,找出需要移除的目标值,通过移动快的指针取值放进新的数组中。

示例代码:

class Solution {public int removeElement(int[] nums, int val) {int len = nums.length;int slowIndex = 0;// 双指针for(int fastIndex = 0; fastIndex < len; fastIndex++) {if(val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
}

还有一种就是双向双指针,一个指针从左开始,一个指针从又开始,左到右找出等于目标值的对象,右到左找到不等于目标值的位置,每次用不等于的覆盖等于的位置

示例代码:

//相向双指针法
class Solution {public int removeElement(int[] nums, int val) {int left = 0;int right = nums.length - 1;while(right >= 0 && nums[right] == val) { //将right移到从右数第一个值不为val的位置right--;} while(left <= right) {if(nums[left] == val) { //left位置的元素需要移除//将right位置的元素移到left(覆盖),right位置移除nums[left] = nums[right];right--;}left++;while(right >= 0 && nums[right] == val) {right--;}}return left;}
}

以上两种解题思路,笔者觉得第一种双向指针对大家来说相对容易理解。

3. 滑动窗口

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

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。

示例代码:

class Solution {public int minSubArrayLen(int target, int[] nums) {int sum = 0;int left = 0;int result  = Integer.MAX_VALUE;for(int i = 0; i < nums.length; i++) {sum =sum + nums[i];while(sum >= target) {result = Math.min(result, i - left + 1);sum = sum - nums[left];left++;   }}return result==Integer.MAX_VALUE ? 0 : result;} 
}

4. 螺旋旋转数组

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

此题在于找出规律和临界点~

例如:
在这里插入图片描述
输出如下:

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

代码示例:

class Solution {public int[][] generateMatrix(int n) {int offset = 1;  // 控制循环次数int[][] res  = new int[n][n];int start = 0;  // 每次循环的开始点(start, start)int count = 1;  // 定义填充数字int i;int j;while (offset <= n / 2) { // 判断边界后,loop从1开始// 从左到右for(j = start; j < n -offset; j++ ) {res[start][j] = count++;}// 右侧从上到下for(i = start; i < n - offset; i++) {res[i][j] = count++;}// 下边从右到左for(;j >= offset; j--) {res[i][j] = count++;   }// 左侧从下到上for(; i >= offset; i--) {res[i][j] = count++; }start++;offset++;}if (n % 2 == 1) {res[start][start] = count;}return res ;}
}

数组常用api总结

  1. 计算数组长度
int[] nums = new int[5];
// 数组长度计算
int len = nums.length;
  1. 计算数组下标最大值
int[] nums = new int[5];
// 数组下标最大值
int maxIndex= nums.length - 1;
  1. 比较两个对象值的最小值
Math.min(len1, len2); // 返回两个值中较小的

上面是笔者在数组结构算法中常用的api总结,由于训练的时候没有idea那么灵活,这些基本方法没有联想功能,硬敲,熟能生巧。

备注:算法学习总结借鉴:《代码随想录》


http://www.ppmy.cn/news/93972.html

相关文章

递归的基本概念

分类&#xff1a; 直接递归 间接递归 如果递归函数中调用递归的语句为最后一个执行语句&#xff0c;则称这种递归为尾递归 递归使用条件 原问题可以划为一个或多个子问题&#xff0c;且子问题的求解方式与原问题相同&#xff0c;只是数量规模不同 递归的调用次…

Ubuntu crontab 遇到的sh脚本一些问题(手动执行可以,自动执行不行)

问题一&#xff1a; 问题描述&#xff1a; 在写一个脚本循环时候&#xff0c;出现“let:not found”,这是因为在ubuntu默认是指向bin/dash解释器的,dash是阉割版的bash,其功能远没有bash强大和丰富.并且dash不支持let和i等功能. 解决办法&#xff1a; 打开一个终端输入&#xf…

PGXC GaussDB

PGXCA PGXC&#xff08;PostgreSQL eXtended Coordinator&#xff09;是一个基于 PostgreSQL 架构的分布式数据库解决方案。它扩展了 PostgreSQL&#xff0c;为用户提供了在多个节点上分布式存储和处理数据的能力。 PGXC 的设计目标是将 PostgreSQL 扩展为能够处理大规模数据…

Python类的属性和方法介绍

Python类的属性和方法介绍 本文主要讲python类属性&#xff08;类变量&#xff09;、实例属性&#xff08;实例变量&#xff09;&#xff1b;类方法、静态方法、实例方法。 【定义在类中的变量也称为属性&#xff0c;定义在类中的函数也称为方法。】 这些都是Python面向对象…

Linux 软件包管理工具

rpm命令管理软件包 1.学会看rpm包&#xff0c;通过rpm包的名字来了解这个软件包的一些基础信息xfsprogs-4.19.0-2.el8.x86_64.rpm xfsprogs 软件名字 4.19.0 版本号 2 发行次数 el8 适用于哪个操作系统&#xff08;rel8&#xff09; x86_64 软…

计算Yocto中LIC_FILES_CHKSUM的md5值

md5网站 https://emn178.github.io/online-tools/md5_checksum.html 将源码中的LICENCE文件丢进去。 LIC_FILES_CHKSUM值的语法如下&#xff1a; LIC_FILES_CHKSUM " file:// license_info_location ;md5 md5_value " license_info_location 这是包含您的许可证信…

STM8使用pwm接口调试GDS06灰尘传感器

背景 刚好有项目使用GDS06这款传感器&#xff0c;这里简单做个记录。 GDS06接口如下&#xff0c;这里支持串口和PWM的输出到MCU&#xff0c;由于项目采用STM8S003F3P6&#xff0c;资源极其有限。 所以硬件设计的时候&#xff0c;就考虑采用PWM的接口方式&#xff0c;这样只是…

【数学建模】矩形桌子能放平(初等模型)

把一把四只脚的椅子往不平的地面上一放&#xff0c;通常只有三只脚着地&#xff0c;放不稳&#xff0c;然而只要稍挪动几次&#xff0c;就可以四脚着地&#xff0c;放稳了。如何解释这种现象&#xff1f; 1 模型假设 椅子四条腿一样长&#xff0c;椅脚与地面接触可视为一个点&…