一文读懂:什么是数组

news2025/5/26 7:18:38

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

什么是数组

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 {// 刚好等于中间值,return
                return  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.coloradmin.cn/o/561486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+mysql电影推荐系统 影院售票选座系统vue

随着互联网的蓬勃发展&#xff0c;现代社会进入了以计算机为中心的信息时代&#xff0c;计算机技术正以一种前所未有的持久方式改变着世界的面貌。应用网络技术电影推荐系统受到许多用户的重视。网站的开发可以对人们的交流起到重要的作用&#xff0c;因此&#xff0c;为了满足…

印象笔记导出HTML再转markdown的方法

前言 我已经使用6年印象笔记了&#xff0c;越来越依赖它了&#xff0c;现在已经有6000多条笔记了&#xff0c;我就想着如果某一天印象笔记没了&#xff0c;那我这些心血就都没了&#xff0c;所以我想要把笔记全部转为markdown格式&#xff0c;然后自己存储起来。可以选择用百度…

chatgpt赋能Python-python_pendulum

Python Pendulum: 了解更便捷的时间操作 在我们的日常生活中&#xff0c;对于时间的操作极为频繁&#xff0c;不仅仅是时钟和日历&#xff0c;还包括计划、调度等等。Python pendulum正是一个极为优秀的工具&#xff0c;它为我们的时间操作提供了更为灵活且方便的使用体验。 …

chatgpt赋能Python-python_plt_坐标轴

Python plt 坐标轴详解 介绍 在数据可视化领域中&#xff0c;matplotlib.pyplot是一款十分流行的python库。它支持绘制各种类型的图表&#xff0c;例如散点图、折线图、柱状图、饼图等。在绘制各种图表时&#xff0c;一个重要的因素就是如何调整和修改坐标轴以展示数据。本文…

chatgpt赋能Python-python_put

Python PUT&#xff1a;了解PUT请求 介绍 在RESTful API中&#xff0c;PUT请求用于更新资源&#xff0c;它是一种向服务器提交指定资源的请求方法。Python是一种流行的编程语言&#xff0c;其标准库中包含了支持基本HTTP协议的模块。Python的requests库是使用最广泛的HTTP库之…

小航编程题库机器人等级考试理论一级(2023年03月) (含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑 答案:B 第1题关于使用动滑轮说法正确的是&#xff1f;&#xff08; &#xff09; A、是否省力与动滑轮的颜色…

Java --- 期末复习卷

一、单选题 1&#xff0e;所有Java应用程序主类必须有一个名叫( )的方法。[ ] A&#xff0e;method B&#xff0e;main() C&#xff0e;java() D&#xff0e;hello 2&#xff0e;编写并保存了一个Java程序文件之后&#xff0c;( )它。[ …

NTLM认证协议

NTLM&#xff08;Windows NT LAN Manager&#xff09;是一种用于身份验证和安全通信的协议。它最初由微软开发&#xff0c;用于早期版本的Windows操作系统。NTLM协议在Windows网络环境中广泛使用&#xff0c;特别是在企业网络中。 NTLM身份验证步骤 NTLM验证是一种Challenge/R…

Java-API简析_java.lang.Class类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130838927 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

【连续介质力学】涉及积分的定理

涉及积分的定理 分部积分 分部积分&#xff1a; ∫ a b u ( x ) v ′ ( x ) d x u ( x ) v ( x ) ∣ a b − ∫ a b v ( x ) u ′ ( x ) d x \int_a^bu(x)v(x)dxu(x)v(x)|_a^b-\int_a^bv(x)u(x)dx ∫ab​u(x)v′(x)dxu(x)v(x)∣ab​−∫ab​v(x)u′(x)dx 其中&#xff0c;…

Packet Tracer - 综合技能练习(配置 VLAN 间路由、配置静态路由以及默认路由)

Packet Tracer - 综合技能练习 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 VLAN R1 S0/0/0 172.31.1.2 255.255.255.0 不适用 不适用 G0/0.10 172.31.10.1 255.255.255.0 不适用 10 G0/0.20 172.31.20.1 255.255.255.0 不适用 20 G0/0.30 172.31.…

chatgpt赋能Python-python_punctuation

了解Python中的标点符号&#xff1a;了解Punctuation&#xff0c;打造Python高效编程 Python是一种精简的高级编程语言&#xff0c;它可以通过简洁的语法和强大的工具集来处理各种编程任务。在Python中&#xff0c;标点符号是非常重要的组成部分。了解Python中的标点符号将有助…

凹函数和凸函数

凹函数英文concave&#xff0c;凸函数英文concave。 在有些参考资料中&#xff0c;凸函数又称为下凹&#xff08;concave down&#xff09;函数&#xff0c;凹函数称为上凹(concave up)函数。 凹函数和凸函数根据判定方法的不同&#xff0c;分为以下两类&#xff1a; 一元函…

Vulkan Tutorial 1 实例和物理设备

目录 0 基本代码 1 Instance 2 验证层 3 物理设备和队列系列 4 逻辑设备和队列 0 基本代码 首先包括LunarG SDK的Vulkan头&#xff0c;它提供了函数、结构和枚举。stdexcept和iostream’头文件被包括在内&#xff0c;用于报告和传播错误 函数将被initVulkan函数调用进入…

C语言生成随机数

目录 概念&#xff1a; 具体运用 实战 1.只使用rand()函数 2.使用rand()函数和srand() 函数 概念&#xff1a; 在实践中&#xff0c;找到真正的随机数字是困难的。数字计算机只能在⼀个限定的范围内和有限的精度下去处理数字。在⼤多数情况下,最好的⽅法是产⽣伪随机数&am…

【AI 孙燕姿】歌声转换技术原理浅析

最近打开B站&#xff0c;首页会推荐很多以【AI 孙燕姿】开头的视频&#xff0c;内容是用孙燕姿的音色去唱其他歌手的歌。出于好(ceng)奇(re)心(du)&#xff0c;作者去了解下歌声转换&#xff08;Singing Voice Conversion&#xff0c;SVC&#xff09;这个任务。不看不知道&…

比亲妈都细,从0-1手把手教你搭建Elasticsearch+kibana+IK分词器

前言&#xff1a; 最近用到了ElasticsearchkibanaIK分词器&#xff0c;但是基本上能搜到的所有教程、视频都用的是老版本的&#xff0c;奈何我又空有一身反骨&#xff0c;我就不爱用老版本的&#xff0c;结果就一个一个的踩坑。 Elasticsearch是我用过的最坑的软件之一了&#…

通过ChatGPT跟MetaHuman对话,Android/iOS兼容

一、申请ChatGPT的API-KEY 1.通过 openAI官网申请API-KEY 2.参考使用腾讯云函数一分钟搭建 OpenAI 免翻墙代理搭建openAI免翻墙代理 3.通过Postman测试一下openAI函数是否可被调用,传入BearerToken和Body参数,ChatGPT即可返回应答数据 二、启用必要的插件 1.启用文字转语…

5.24黄金短线上涨能否继续做空?今日如何布局

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;黄金消息面解析&#xff1a;周二(5月23日)&#xff0c;国际金价延续隔夜跌势&#xff0c;因在美联储官员的鹰派言论推动下&#xff0c;美元重启涨势&#xff0c;尽管…

chatgpt赋能Python-python_padding

Python中Padding的介绍 在Python编程中&#xff0c;Padding是一种在字符串或序列前后添加空格或其他占位符来实现对齐的技术。这种技术常用于数据格式化、打印输出、加密等场合&#xff0c;具有很高的实用性。 Python中Padding技术主要由三种函数实现&#xff1a;rjust, ljus…