当前位置:   article > 正文

JAVA数据结构及刷题算法_java算法刷题

java算法刷题

一 创建数组 常用四种方式

1 int[] a = {1,2,3};

2 int[] b = new int[]{1,2,3};

3 int[] c = new int[3];(默认情况都是0)

4 ArrayList<integer> arr = new ArrayList<>();(不需要指定长度和元素)

二 添加元素

ArrayList<integer> arr = new ArrayList<>();//创建ArrayList对象

arr.add(99);//默认插在尾端,当末尾有内存地址可添加时,时间复杂度o(1);当内存末尾没有内存地址时,需要重新申请内存,此时时间复杂度为o(n)。

arr.add(3,88) //第一个参数是索引,第二个参数是要插入的值。

三 访问元素 通过下标或者索引访问。时间复杂度o(1)

int c1 = c[1];

int arr1 = arr.get(1);

四 更新元素

c[1] = 11;

arr.set(1,11); //第一个参数为索引,第二个为数值

五 删除元素

arr.remove(3);//参数为要删除的元素

六 数组长度 时间复杂度为O(1);因为数组创建时会维持一个变量,调用方法时直接返回变量,而不是一个一个遍历

int cSize = c.length;

int arrSize = arr.size();

七 遍历数组 for循环

八 查找元素  时间复杂度o(n)

c1遍历查找

boolean is99 = arr.contains(99); //是否包含元素99

九 排序 时间复杂度O(N logN)

Array.sort(c);//默认从小到大排序

Collections.sort(arr);默认从小到大排序

从大到小排序

abc三种创建数组方式:

1 先sort排序,然后 从后往前读

2 将int[] c转化成Integer[] c,然后Collections.sort(arr,Collections.reverseOrder());//反向排序

链表list

创建 LinkedList<Integer> list = new LinkedList<>();

添加 list.add(0);//尾部添加

list.add(2,99)//第一个参数为插入的位置,第二个参数为插入元素的数值。

访问元素

list.get(2);//返回第二个元素的值

搜索元素

list.indexOf(99);

更新元素

list.set(2,88);和add参数类似

删除元素

list.remove(2);删除第二个索引位置的元素

长度,时间复杂度o(1)

int length = list.size();长度

队列常用操作

创建队列

Queue<Integer> queue = new LinkedList<>();推荐用链表实现Queue,方便操作

添加元素

queue.add(元素)

获取即将出队的元素(队列的头元素)

int templ = queue.peek();

删除即将出队的元素

int temp2 = queue.poll();//还有其他方法例如remove()等

判断队列是否为空(本质判断队列长度是否为0)

boolean a = queue.isEmpty();

队列长度

int len = queue.size();

遍历队列(一般边遍历边删除)

while(!queue.isEmpty()){

    int temp = queque.poll();

    System.out.println(temp);

}

栈常用操作

  1 创建栈,包含在stack中

Stack<Integer> stack = new Stack<>();

2 添加元素

  1. stack.push(1);
  2. stack.push(2);
  3. System.out.println(stack.toString());

3 获取栈顶元素

stack.peek();

4 删除栈顶元素

删除并返回栈顶元素

  1. int temp = stack.pop();
  2. System.out.println(temp);

5 栈的大小

stack.size();

6 栈是否为空

stack。isEmpty();

7 栈的遍历

  1. //边删除边遍历
  2. while(!stack.isEmpty()){
  3. int num = stack.pop();
  4. System.out.println(num);
  5. }

哈希hash表常用操作 key-value

 访问access:不能

 搜索search : o(1) 通过搜索key,碰撞时时间复杂度为o(k),k为碰撞元素的个数。

 插入 insert :o(1)

 删除delete :o(1)

哈希表常用操作:

1 创建哈希表

1数组自主创建,数组的索引为key,值为value

2 用系统的hashmap创建,第一个为key,第二个为value

HashMap<Integer,String> map = new HashMap<>();

2 添加元素  o(1)

  1. map.put(1,"hanmei");
  2. map.put(2,"lihua"):

3 更新元素  o(1)

map.put(1,"bishi");

 删除元素

map.remove(1); //参数为key

5 获取key的值 value,传递参数为key,返回值为value

map.get(1);

6 检查key是否存在

map.containsKey(3);

 长度

  1. //Length
  2. //time complexity:o(1
  3. //hashtable check the length
  4. map。size();

是否还有元素

  1. //Is Empty
  2. // time complexity:o(1
  3. map.isEmpty();

集合 set

特点:无序,不重复

 作用:检查某一元素是否存在;检查重复元素

分类 HashSet;LinkListSet;TreeSet......

HashSet(哈希集合实质上背后是一张哈希表),所以有可能会产生Hash冲突。

集合Hashset的常用操作

创建集合

HashSet<Integer> set = new HashSet<>();

添加元素

  1. set.add(10);
  2. set.add(1);
  3. set.add(2);

搜索元素

set.contains(2);

删除元素

set.remove(10);

查看长度

set.size();

堆(完全二叉树的最大堆,最小堆)

访问

搜索:堆顶元素o(1);堆任意元素o(n)

添加:o(logN)

删除:o(logN)原因:

java中堆的常用操作

1 创建堆,堆化, o(N)。原因:先将数进行堆化O(n),然后将堆化的数据排序,以最小堆为例 o(n) 

函数:

import java.util.PriorityQueue

创建最小堆(默认)

PriorityQueue<Integer> minheap = new PriorityQueue<>();

创建最大堆

PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());

2 添加元素 

  1. minheap.add(10);
  2. maxheap.add(10);

3 获取堆顶元素

  1. minheap.peak();
  2. maxheap.peek();

4 删除并返回堆顶元素

  1. minheap.poll();
  2. maxheap.poll();

5 堆的长度(大小)

  1. minheap.size();
  2. maxheap.size();

6 堆的遍历

  1. while( !minheap.isEmpty() ){
  2. minheap.poll();
  3. }

leetcode p215 p692

常用算法

1 双指针

快慢双指针:一般两个指针,每次快指针移动两次,慢指针移动一次。例如环形列表中移动几次后这两个指针会在同一位置。p141,p881

对撞双指针:两个指针,一个在前,一个在后。一般数组有序的时候可以考虑

2 二分法  分,就硬分,注意要low 和 high对撞跳出while(low < high)循环

3 滑动窗口(sliding window)

 目的 减少while循环 一般数组中的定长问题

lc 209 1456

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/680801
推荐阅读
相关标签
  

闽ICP备14008679号