数组Array
在连续的内存空间中,存储一组相同类型的元素。
时间复杂度:访问o(1)、搜索o(n)、插入o(n)、删除o(n)
适合读不适合写
常用操作
创建数组
- int[] arr = {1,2,4, …};
- int[] arr1= new int[3];//所有的元素值均为0
- int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};//多维数组
- int[][] arr = new int[m][n];
- List
arr = new ArrayList<>(); - List转数组:String[] arr = list.toArray(new String[list.size()]);
- 数组转List:List
list = Arrays.asList(arr); - 数组转List:List
list = Arrays.stream(nums).boxed().collect(Collectors.toList());
添加元素
- arr[index] = m;//o(1)
- list.add(m);//o(1)
- list.add(n,m);//o(n)->在n处插入m
访问元素o(1)
- arr[index];
- list.get(index);
修改元素o(1)
- arr[index] = m;
- list.set(n,m);
删除元素o(n)
- list.remove(index);
遍历数组o(n)
- for (int i=0;i<arr.length;i++) {arr[i]…}
- for (int i=0;i<list.size();i++) {list.get(i)…}
查找元素o(n)
- for (int i=0;i<arr.length;i++) {arr[i]==m?…:…}
- boolean flag = arr.contains(m);
数组的长度
- arr.length;
- list.size();
数组排序o(nlogn)
- Arrays.sort(arr);
- Collections.sort(list));
Collections.sort(list,Colections.reversOrder());//反序,数组arr若要反序则需将int[]转为Integer[],也用该方法
链表LinkedList
存在指针,指向上一个或下一个
时间复杂度:访问o(n)、搜索o(n)、插入o(1)、删除o(1)
适合写不适合读常用操作
创建链表
LinkedList
list = new LinkedList<>();
添加元素
- list.add(integer);//o(1)
- list.add(2,99);//o(n)
访问元素
- list.get(index)
查找元素
- list.indexof(integer);//返回索引值
更新元素
- list.set(2,88);
删除元素
- list.remove(index);
链表的长度
添加元素o(1)
queue.add(integer);
获取即将出队的元素o(1)
queue.peek();
删除即将出队的元素o(1)
queue.poll();
判断队列是否为空o(1)
queue.isEmpty();
队列长度o(1)
queue.size();
栈Stack
先入后出
时间复杂度:访问o(1)、搜索o(n)、插入o(1)、删除o(1)
常用操作
创建栈
Stack
添加元素o(1)
stack.push(integer);
获取栈顶元素o(1)
stack.peek();
删除栈顶元素o(1)
stack.pop();
栈的长度o(1)
stack.size();
栈是否为空o(1)
stack.isEmpty();
遍历栈o(n)
while(!stack.isEmpty()) {
sout(stack.pop());
}
哈希表HashTable
key、value键值对
哈希碰撞:2个不同的key通过同一个哈希函数得到了相同的地址,则将后面一个key以链的方式连接在前一个key上
时间复杂度:访问不存在、搜索o(1)、插入o(1)、删除o(1)、碰撞o(k),k为碰撞元素的个数
常用操作
创建哈希表
- String[] hashTable = new String[4];
- HashMap
map = new HashMap<>();
添加元素o(1)
- hashTable[1] = “1”;
- map.put(1,”1”);
更新元素o(1)
- hashTable[1] = “1”;
- map.put(1,”1”);
删除元素o(1)
- hashTable[1] = “”;
- map.remove(1);
获取key的值o(1)
- hashTable[1];
- map.get(3);
检查key是否存在o(1)
- map.containsKey(3);
哈希表长度o(1)
- map.size();
哈希表是否还有元素o(1)
-
集合Set
无顺序且数据不重复
主要作用:检查某个元素是否存在、有无重复元素
时间复杂度:访问不存在、搜索无哈希冲突o(1)/有哈希冲突o(k)、插入无哈希冲突o(1)/有哈希冲突o(k)、删除无哈希冲突o(1)/有哈希冲突o(k),k为冲突元素的个数常用操作
创建集合
HashSet
set= new HashSet<>();
添加元素o(1)
- set.add(1);
删除元素o(1)
- set.remove(2);
查询元素o(1)
- set.contains(2);
长度o(1)
-
树Tree
是一种父子关系
高度:从叶子节点往根节点方向数,从0开始
- 深度:从根节点往叶子节点方向数,从0开始
-
二叉树
普通二叉树:每个节点至多两个孩子
- 满二叉树:除了叶子节点,每个节点都有两个孩子,且所有叶子节点都在同一层上
- 完全二叉树:从根节点起,从上到下,从左到右,依次填满节点形成的二叉树
遍历
- 前序:根左右
- 中序:左根右
-
堆Heap
一种二叉树的结构,是完全二叉树,且每个节点的数量大于等于叶子节点的数量(最大堆),或每个节点的数量小于等于叶子节点的数量(最小堆)。
最大堆:堆顶元素是最大值
最小堆:堆顶元素是最小值
时间复杂度:访问不存在、搜索o(n)、插入o(logn)、删除o(logn)常用操作
创建堆
PriortyQueue
minheap= new PriortyQueue<>(); - PriortyQueue
maxheap= new PriortyQueue<>(Collections.reverseOrder());
添加元素
- minheap.add(1);
获取堆顶元素
- minheap.peek();
删除堆顶元素
- minheap.poll();
堆的长度
- minheap.size();
堆的遍历
- while(!minheap.isEmpty()) {
图Graph
是一种邻居关系
一个顶点有几条边,则有几个度
图分为无向图、有向图、权重图
有向图有入度与出度的概念
入度:多少边指向该顶点
出读:多少边从这个点为起点,指向别的顶点
