给数组(array)插入元素、删除元素

array

  • 1 数组增加元素
  • 2 数组中删除元素
  • 3 与链表的对比

1 数组增加元素

一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度

数组增加元素的思路:

  1. 建一个新的数组,数组长度为原数组的长度加一。
  2. 将需要增加的元素值赋给数组的最后一个元素。
  3. 将新的数组赋给原来的数组

那么能否在数组某一下标增加元素呢
假设在已知数组中在指定位置添加一个元素,那么在这位置的数据元素就会被替换掉。

public class InsertArray {
 
	public static void main(String[] args) {
		int index = 2;
		int value = 5;
		int[] array = new int[]{1,2,3,4};
		array[index] = value;
		System.out.println(Arrays.toString(array));
	}
 
}

在这里插入图片描述
要想解决上面的问题,那只能:

  1. 创建一个新数组,新数组长度 = 旧数组长度 + 1
  2. 在把旧数组里面的元素复制到新元素里面
  3. 根据指定位置之后的数组元素往后移一位
  4. 把指定的元素插进去
  5. 再把新数组赋给旧数组
public class InsertArray {
 
	public static void main(String[] args) {
		int index = 2;
		int value = 5;
		int[] array = new int[]{1,2,3,4};
		int[] newArray = new int[array.length + 1];// 创建新数组
		for (int i = 0; i < array.length; i++) {
			newArray[i] = array[i];
		}
		for (int i = newArray.length - 1; i > index; i--) {
			newArray[i] = newArray[i - 1];
		}
		newArray[index] = value;
		array = newArray;// 把新数组赋给旧数组
		System.out.println(Arrays.toString(array));
	}
 
}

在这里插入图片描述

https://blog.csdn.net/demo_gsl/article/details/81060206

或者使用集合ArrayList

https://blog.csdn.net/qq_33958946/article/details/82710172

2 数组中删除元素

数组的元素是不能删的,只能覆盖。
例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示:
给数组(array)插入元素、删除元素_第1张图片
思路:

  1. 创建一个新数组,数组长度为原来数组的长度减一
  2. 定义需要删除的元素下标
  3. 将删除下标之前的元素赋给新数组的下标值,删除下标之后的元素赋给新数组下标值-1
package test;

import java.util.Arrays;

public class TestOpArray {
    public static void main(String[] args) {
        //解决数组删除元素的问题
        //目标数组
        int[] arr = new int[] {9,8,7,6,5,4};
        System.out.println(Arrays.toString(arr));
        //要删除元素的下标
        int dst=3;
        //创建一个新的数组,长度是原数组-1
        int[] newarr = new int[arr.length-1];
        //复制原数组中除了要删除的那个元素以外的其他元素
        for (int i = 0; i < newarr.length; i++) {
            //要删除之前的元素
            if(i<dst) {
                newarr[i] = arr[i];
                //要删除之后的元素
            }else {
                newarr[i]=arr[i+1];
            }
        }
        //新数组替换旧数组
        arr = newarr;
        System.out.println(Arrays.toString(arr));
    }
}

给数组(array)插入元素、删除元素_第2张图片

https://www.cnblogs.com/yitianyitian/p/12456548.html

3 与链表的对比

  1. 数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的(链表是通过指针域的指针链接在内存中各个节点);
    如图所示:
    给数组(array)插入元素、删除元素_第3张图片
    这个链表起始节点为2, 终止节点为7, 各个节点分布在内存个不同地址空间上,通过指针串联在一起。
  2. 性能给数组(array)插入元素、删除元素_第4张图片
    数组的插入/删除操作的时间复杂度为O(n):数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。如往数组插入元素操作,需要定义新数组,把旧数组的元素所要增加的元素复制到新数组,这样每个元素都被操作过至少1次,n个元素则至少被操作了n次,故时间复杂度为O(n)。

数组的查询操作时间复杂度为O(1):直接根据下标定位到数组相应元素即可查询到对应元素,不需要从数组第1个下标(第1个元素)开始遍历。

链表的插入/删除操作的时间复杂度为O(1):链表的长度可以是不固定的,并且可以动态增删。如删除D节点:
给数组(array)插入元素、删除元素_第5张图片
只要将C节点的next指针指向E节点就可以了。这样删除某个节点,只需对该节点前后的节点进行操作,故时间复杂度为O(2),即为O(1)。

链表的查询操作的时间复杂度:
如要查询下图第五个节点(节点E),需要从头节点(节点A)查找,即所查询元素的前面所有元素都要进行查询操作,故链表查找操作的时间复杂度是 O ( n ) O(n) O(n)
给数组(array)插入元素、删除元素_第6张图片

你可能感兴趣的:(排序算法,java,leetcode)