算法通关村第三关——数组

这篇具有很好参考价值的文章主要介绍了算法通关村第三关——数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先要理解什么是线性表:

从语言实现的角度:

分为顺序型和链表型,顺序型就是将数据存储在一段固定的空间内,这样访问的效率很高,但是如果要删除和增加元素的话代价比较高。

而在链表型里,元素之间是通过地址依次连接的,因此访问时必须从头开始逐步向后找,因此查找效率低,而删除和增加元素非常方便。

从访问限制的角度:

栈和队列又称为访问受限的线性表,插入和删除受到了限制,只能在固定的位置进行。

从扩容的角度:

分离式结构的顺序表,要加大存储空间的时候,可以在不改变表对象的前提下对数据存储区进行扩容。

概念

数组中的元素是一个一个紧密排列的。在数组中是用索引来标记每项数据的位置。

在数组中要查找一个元素还是非常容易地。

public static int findByElement(int[] arr, int size, int key) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == key)
            return i;
    }
    return -1;
}

直接循环,如果当前的值等于要查找的元素,直接返回下标就可以了。

在数组中增加元素就有点复杂了。

public static int addByElementSequence(int[] arr, int size, int element) {
    //size和arr.length都表示元素的数量,都是从1开始编号
    if (size >= arr.length)
        return -1;
    int index = size;
    //找到新元素的插入位置
    for (int i = 0; i < size; i++) {
        if (element < arr[i]) {
            index = i;
            break;
        }
    }
    //元素后移
    for (int j = size; j > index; j--) {
        arr[j] = arr[j - 1]; //index下标开始的元素后移一个位置
    }
    arr[index] = element;//插入数据
    return index;
}

在这个代码中,int index = size这一行是我刚开始疑惑的点,后来通过调试发现,如果要插入的数据在原有数组的中间而不是首尾的时候,index会在循环中间变化,但是比如说原有数组时[1,2,3,4],现在要插入的元素是5,那么在循环中不会对index的值发生改变,这样的花就要让index的值为size。

在这里如果要加入一个元素的话,那么后面的每个元素都需要向后移一位。

删除元素

public static int removeByElement(int[] arr, int size, int key) {
    int index = -1;
    for (int i = 0; i < size; i++) {
        if (arr[i] == key) {
            index = i;
            break;
        }
    }
    if (index != -1) {
        for (int i = index + 1; i < size; i++)
            arr[i - 1] = arr[i];
        size--;
    }
    return size;
}

一样的,先找到要删除的那个元素的下标,然后,将循环条件反过来就好了。

单调数组问题:

要看一个数组是否单调递增或者单调递减,就看它数组中的每个元素是不是后面的一个比前面的一个大或小。

public static boolean isMonotonic_2(int[] nums) {
    boolean inc = true, dec = true;
    int n = nums.length;
    for (int i = 0; i < n - 1; ++i) {
        if (nums[i] > nums[i + 1]) {
            inc = false;
        }
        if (nums[i] < nums[i + 1]) {
            dec = false;
        }
    }
    return inc || dec;
}

数组合并问题:

public void merge(int[] nums1, int nums1_len, int[] nums2, int nums2_len) {
    int i = nums1_len + nums2_len - 1;
    int len1 = nums1_len - 1, len2 = nums2_len - 1;
    while (len1 >= 0 && len2 >= 0) {
        if (nums1[len1] <= nums2[len2])
            nums1[i--] = nums2[len2--];
        else if (nums1[len1] > nums2[len2]) 
            nums1[i--] = nums1[len1--];
    }
    // 假如A或者B数组还有剩余
    while (len2 != -1) nums1[i--] = nums2[len2--];
    while (len1 != -1) nums1[i--] = nums1[len1--];
}

我要两个数组合并后的数组还是单调的,比较好的方式是从后向前插入,A和B的元素数量是固定的,所以排序后最远位置一定是A和B元素都最大的那个,依此类推,每次都找最大的那个从后向前填就可以了文章来源地址https://www.toymoban.com/news/detail-665609.html

到了这里,关于算法通关村第三关——数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村-----数组实现加法专题问题解析

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。详见leetcode66 可以从数组的末尾,即length-1下标处开始向前遍历,末尾元素➕

    2024年02月10日
    浏览(38)
  • 算法通关村——不简单的数组增删改查

    数组作为最基础,最常用的数据结构,大多数人可能会觉得它很简单,但是,你真的了解数组吗?看完这篇文章,带你认识更深层次的数组。 首先我们要知道,数组是什么呢?数组是存放相同数据类型元素的集合,我们可以通过索引来访问数组,需要注意的是,数组中第一个

    2024年02月12日
    浏览(28)
  • 算法通关村第3关【青铜】| 不简单的数组增删改查

    找到目标位置 先找到目标位置,再后移插入 也可以边遍历边移动元素 先找到目标位置,再覆盖  思路: 题目提示已经很清楚,只需循环两次分别判断是不是递增或者递减的,都不是就返回false。 也可以只遍历一次,当一次循环中既遇到递增又遇到递减情况就返回false。 思路

    2024年02月12日
    浏览(24)
  • 【2023】字节跳动 10 日心动计划——第三关

    🔗 原题链接:32. 最长有效括号 类似于有效的括号,考虑用栈来解决。 具体来讲,我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标。 从左往右遍历整个字

    2024年02月13日
    浏览(26)
  • 算法通关村第十四关——解析堆在数组中找第K大的元素的应用

    力扣215题 , 给定整数数组nums和整数k,请返回数组中第k个最大的元素。 请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 分析 :按照“找最大用小堆,找最小用大堆,找中间用两个堆”,这道题用最小堆来解决,构造一个大小只有K的最小堆

    2024年02月07日
    浏览(27)
  • 文件上传upload-labs第三关,Apache无法解析php3、php5等问题

    修改文件后缀名为php5,上传后。无法解析php5 参考网上众多教程,修改httpd.conf配置文件: 添加.php3 .php5 phtml,大部分都可以解决 PHPStudy中AddType application/x-httpd-php等Apache命令之所以在Apache的设置文件中设置后未实现目标效果是由于PHP的版本不符导致的 修改版本,切换到如图所

    2024年02月12日
    浏览(40)
  • C算法:使用选择排序实现从(大到小/从小到大)排序数组,且元素交换不可使用第三变量。

    需求: 使用选择排序实现从(大到小/从小到大)排序,且元素交换不可使用第三变量 (异或交换法) 代码实现: 打印:

    2024年02月08日
    浏览(37)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(26)
  • 算法通关村——删除元素专题

    LeetCode27.给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用  O(1)  额外空间并  原地 修改输入数组 。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例

    2024年02月13日
    浏览(27)
  • 算法通关村番外篇-跳表

    大家好我是苏麟 , 今天来聊聊调表 . 跳表很少很少实现所以我们只了解就可以了 .  链表在查找元素的时候,因为需要逐一查找,所以查询效率非常低,时间复杂度是O(N),于是就出现了跳表。 跳表是在链表基础上改进过来的,实现了一种「多层」的有序链表 ,这样的好处是

    2024年02月01日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包