数组(Array)

本文介绍了数据结构中的线性表和数组,详细讲解了数组的定义、内存分布及缺点,并探讨了动态数组的概念。此外,通过三个经典算法题——两数之和、三数之和和下一个排列,展示了数组在解决问题中的应用和优化策略。
摘要由CSDN通过智能技术生成

1.数据结构概述

      1.1 什么是数据结构
  • 计算机中数据存储和组织的方式
      1.2 数据结构的分类
  • 线性结构: 数组 链表 栈 队列 哈希表
  • 树形结构: AVL数 红黑数 B树 堆 Trie 哈夫曼数 并查集
  • 图形结构: 邻接矩阵 领接表

2.线性表–数组

      2.1 什么是线性表
  • n个相同类型元素的有限序列
      2.2 线性表由什么?
  • 数组
  • 队列
  • 链表
  • 哈希表
      2.3 什么是数组
  • 是一种顺序存储的线性结构,所有的元素地址空间是连续的
  • 随机访问速度快 因为访问地址编译器可以直接计算出 ele[ i ] 的 地 址= index + i*每个数据占用字节大小
      2.2 数组的内存分布
  • int[ ] arr=new int[ ]{1,2,3 };
    在这里插入图片描述
      2.4 数组缺点
  • 不能动态扩容
      2.5 数组升级–动态数组
  • 2.5.1 泛型数组和和基本类型的数组空有什么区别?
    • 基本类型数组中存储的是基本类型的值 而泛型数组中存储的对象的地址
    • 假如数组中存储对象,在数组初始化还没有add时,数组占用的空间大小依然为对象的空间 这样会浪费掉空间。
      在这里插入图片描述
  • 2.5.2 代码实现
/**
 * 自定义可以存放任何类型的动态数组 所以需要定义:泛型
 * 泛型:new 对象根据传入的类型,确定类中泛型所表示的具体类型
 * 泛型的本质:类型占位符
 * 泛型的好处:扩展类中(属性 方法参数 返回值)类型 提高类的通用性  如果没有泛型需要在定义类属性 参数 返回值类型。
 */
public class DynamicArray2<T> {
   
    // ------------1.属性-------------
    private T[] elements;
    private int size;
    // 数组默认容量 常数定值只有一份 不用变
    private static final int DEFAULT_CAPACITY = 10;
    // 元素不存在
    private static final int ELEMENT_NOT_FOUND = -1;
   // 记录扩容次数 只是为了方便显示而已
    private static int sumCampacity=0;
    // ------------2.构造器-------------
    /**
     * 默认构造10的大小
     */
    public DynamicArray2() {
   
        this(DEFAULT_CAPACITY);
    }
    /**
     * 传入其他长度的构造函数
     *
     * @param capacity
     */
    public DynamicArray2(int capacity) {
   
        elements = (T[]) new Object[capacity];
    }

    // ------------3.方法-------------

    /**
     * 元素的数量
     * @return
     */
    public int size() {
   
        return size;
    };

    /**
     * 是否为空
     *
     * @return
     */
    public boolean isEmpty() {
   
        return size == 0;
    } ;

    /**
     * 是否包含某一个元素
     *  查找元素的角标只要不是-1 即有这个元素
     *
     * @param ele
     * @return
     */
    public boolean contains(T ele) {
   
        return indexOf(ele) != ELEMENT_NOT_FOUND;
    };
    /**
     * 某一个位置添加一个具体的元素
     *
     * @param index
     * @param ele
     */
    public void add(int index,  T ele) {
   
        //1. 判断index是否合法
       rangeCheckForAdd(index);
        //2. 扩容后添加
        if (size == index) {
   
            // 位运算效率高 扩容1.5倍
            int newCampacity=size+(size>>1);
            T[] newElements = (T[])new Object[newCampacity];
            for (int i = 0; i < size; i++) {
   
                newElements[i]=elements[i];
            }
            elements=newElements;
            for (int i = size-1; i < index; i--) {
   
                elements[i]=elements[i-1];
            }
            size++;
            elements[index]=ele;

        }else {
   
            //3.不需要扩容添加
            for (int i = size; i > index; i--) {
   
                elements[i]=elements[i-1];
            }
            size++;
            elements[index]=ele;  }
    };

    /**
     * 添加元素到数组尾部
     *
     * @param ele
     */
    public void add(T ele) {
   
        add(size, ele);
    }


    public T get(int index) {
   
        if(index<0||index >=size) throw new IllegalArgumentException
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值