JAVA 基础算法汇总(持续更新)

这篇具有很好参考价值的文章主要介绍了JAVA 基础算法汇总(持续更新)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、查找算法

1.顺序查找(线性查找)

2.二分查找

二、排序算法

1.冒泡排序

2.直接选择排序

3.插入排序

4.直接插入排序

·

·

·

三、链表的基础操作

1.链表的创建

2.移除链表元素

3.设计链表

4.ListNode temp = head 与  ListNode dumpyNode = new ListNode(0) 的区别

四、树的基础操作

1.二叉树的定义

2.二叉树的递归遍历,前中后

3.层序遍历

4.求树的最大高度


前言

做一些基础数据结构算法汇总,便于日后复习。

一、查找算法

1.顺序查找(线性查找)

依据数组的下标按顺序进行查找,然后返回数组下标。对于数据量较小的情况,比较适用。但是如果数据量较大,花费的时间就比较多。

2.二分查找

二分查找 Binary Search

二分查找的使用,要有一个前提条件:要查找的数必须在一个有序数组里。在这个前提下,取中间位置数作为比较对象:

  • 若要查找的值和中间数相等,则查找成功。
  • 若小于中间数,则在中间位置的左半区继续查找。
  • 若大于中间数,则在中间位置的右半区继续查找。

不断重复上述过程,直到查找成功或者查找区域变为 0,查找失败。

public static int binarySearch(int[] nums, int left, int right, int target){
        if (left>right){ //没有查找到
            return -1;
        }
        int mid =( left+right)/2;//找区间中间值
        if (nums[mid]>target){
            return binarySearch(nums,left,mid-1,target);//找左区间
        }else if (nums[mid]<target){
            return binarySearch(nums,mid+1,right,target);//找右区间
        }else {
            return mid; //找到
        }  
    }

二、排序算法

1.冒泡排序

JAVA 基础算法汇总(持续更新)

按从小到大排序举例:

        1.比较相邻的两个元素,若前边的元素大于后边的元素则交换。

        2.每一对相邻元素都要进行比较。每一个轮次,将最大的排到最后。

        3.针对剩余的元素,重复上述步骤

        4.没有元素交换,完成排序。

public void bubbleSort(int[] arr) {
	int temp = 0;
	boolean flag;
	for (int i = arr.length - 1; i > 0; i--) { // 每次需要排序的长度
		flag = false;
		for (int j = 0; j < i; j++) { // 从第一个元素到第 i 个元素,即对剩余元素进行处理
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = true;
			}
		} 
		if (!flag){ //如果为flase 则没有发生交换,排序结束
		break;
		}
	}
}

2.直接选择排序

JAVA 基础算法汇总(持续更新)

  1. 第一趟,程序将记录定位在第一个数据上,拿第一个数据依次和后面的数据进行比较,如果第一个数据大,交换,依次类推。经过第一趟比较,这组数据中最小的数据被选出来,排在第一位。
  2. 第二趟,程序将记录定位在第二个数据上,拿第二个数据依次和后面的数据比较,同样地,第二个数据大就交换。经过第二次比较,这轮最小的书被选出来,放在了第二位。

  这样经过n-1次比较,这组数据就会变得有序。

private static void selectSort(int[] arr) {
		for(int i = 0;i < arr.length;i++) {
			//将当前索引(即“待排序数组”的首位)定为最小值索引
			int min = i; 
			//通过循环找出最小值索引。注意:此处未发生交换
			for(int j = i + 1;j < arr.length;j++) {
				if(arr[j] < arr[min]) {
					min = j;
				}
			}
			//若最小值索引不为i,则交换
			if(min != i) {
				int tmp = arr[min];
				arr[min] = arr[i];
				arr[i] = tmp;
			}
		}
	}

3.插入排序

4.直接插入排序

·

·

·

三、链表的基础操作

1.链表的创建

public class ListNode {
    // 结点的值
    int val;

    // 下一个结点
    ListNode next;

    // 节点的构造函数(无参)
    public ListNode() {
    }

    // 节点的构造函数(有一个参数)
    public ListNode(int val) {
        this.val = val;
    }

    // 节点的构造函数(有两个参数)
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

2.移除链表元素

/**
 * 添加虚节点方式
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 * @param head
 * @param val
 * @return
 */
public ListNode removeElements(ListNode head, int val) {
    if (head == null) {
        return head;
    }
    // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
    ListNode dummy = new ListNode(-1, head);
    ListNode pre = dummy;
    ListNode cur = head;
    while (cur != null) {
        if (cur.val == val) {
            pre.next = cur.next;
        } else {
            pre = cur;
        }
        cur = cur.next;
    }
    return dummy.next;
}
/**
 * 不添加虚拟节点方式
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 * @param head
 * @param val
 * @return
 */
public ListNode removeElements(ListNode head, int val) {
    while (head != null && head.val == val) {
        head = head.next;
    }
    // 已经为null,提前退出
    if (head == null) {
        return head;
    }
    // 已确定当前head.val != val
    ListNode pre = head;
    ListNode cur = head.next;
    while (cur != null) {
        if (cur.val == val) {
            pre.next = cur.next;
        } else {
            pre = cur;
        }
        cur = cur.next;
    }
    return head;
}

3.设计链表

//单链表
class ListNode {
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val) {
        this.val=val;
    }
}
class MyLinkedList {
    //size存储链表元素的个数
    int size;
    //虚拟头结点
    ListNode head;

    //初始化链表
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
    }

    //获取第index个节点的数值
    public int get(int index) {
        //如果index非法,返回-1
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode currentNode = head;
        //包含一个虚拟头节点,所以查找第 index+1 个节点
        for (int i = 0; i <= index; i++) {
            currentNode = currentNode.next;
        }
        return currentNode.val;
    }

    //在链表最前面插入一个节点
    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    //在链表的最后插入一个节点
    public void addAtTail(int val) {
        addAtIndex(size, val);
    }

    // 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
    // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
    // 如果 index 大于链表的长度,则返回空
    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        if (index < 0) {
            index = 0;
        }
        size++;
        //找到要插入节点的前驱
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        ListNode toAdd = new ListNode(val);
        toAdd.next = pred.next;
        pred.next = toAdd;
    }

    //删除第index个节点
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        size--;
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        pred.next = pred.next.next;
    }
}

//双链表
class MyLinkedList {
    class ListNode {
        int val;
        ListNode next,prev;
        ListNode(int x) {val = x;}
    }

    int size;
    ListNode head,tail;//Sentinel node

    /** Initialize your data structure here. */
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
        tail = new ListNode(0);
        head.next = tail;
        tail.prev = head;
    }
    
    /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
    public int get(int index) {
        if(index < 0 || index >= size){return -1;}
        ListNode cur = head;

        // 通过判断 index < (size - 1) / 2 来决定是从头结点还是尾节点遍历,提高效率
        if(index < (size - 1) / 2){
            for(int i = 0; i <= index; i++){
                cur = cur.next;
            }            
        }else{
            cur = tail;
            for(int i = 0; i <= size - index - 1; i++){
                cur = cur.prev;
            }
        }
        return cur.val;
    }
    
    /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
    public void addAtHead(int val) {
        ListNode cur = head;
        ListNode newNode = new ListNode(val);
        newNode.next = cur.next;
        cur.next.prev = newNode;
        cur.next = newNode;
        newNode.prev = cur;
        size++;
    }
    
    /** Append a node of value val to the last element of the linked list. */
    public void addAtTail(int val) {
        ListNode cur = tail;
        ListNode newNode = new ListNode(val);
        newNode.next = tail;
        newNode.prev = cur.prev;
        cur.prev.next = newNode;
        cur.prev = newNode;
        size++;
    }
    
    /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
    public void addAtIndex(int index, int val) {
        if(index > size){return;}
        if(index < 0){index = 0;}
        ListNode cur = head;
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        ListNode newNode = new ListNode(val);
        newNode.next = cur.next;
        cur.next.prev = newNode;
        newNode.prev = cur;
        cur.next = newNode;
        size++;
    }
    
    /** Delete the index-th node in the linked list, if the index is valid. */
    public void deleteAtIndex(int index) {
        if(index >= size || index < 0){return;}
        ListNode cur = head;
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        cur.next.next.prev = cur;
        cur.next = cur.next.next;
        size--;
    }
}

4.ListNode temp = head 与  ListNode dumpyNode = new ListNode(0) 的区别

JAVA 基础算法汇总(持续更新)文章来源地址https://www.toymoban.com/news/detail-443531.html

四、树的基础操作

1.二叉树的定义

public class TreeNode {
    int val;
  	TreeNode left;
  	TreeNode right;
  	TreeNode() {}
  	TreeNode(int val) { this.val = val; }
  	TreeNode(int val, TreeNode left, TreeNode right) {
    		this.val = val;
    		this.left = left;
    		this.right = right;
  	}
}

2.二叉树的递归遍历,前中后

// 二叉树的前序遍历
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        preorder(root, result);
        return result;
    }

    public void preorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        preorder(root.left, result);
        preorder(root.right, result);
    }
}
// 二叉树的中序遍历
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    void inorder(TreeNode root, List<Integer> list) {
        if (root == null) {
            return;
        }
        inorder(root.left, list);
        list.add(root.val);             // 注意这一句
        inorder(root.right, list);
    }
}
// 二叉树的后序遍历
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postorder(root, res);
        return res;
    }

    void postorder(TreeNode root, List<Integer> list) {
        if (root == null) {
            return;
        }
        postorder(root.left, list);
        postorder(root.right, list);
        list.add(root.val);             // 注意这一句
    }
}

3.层序遍历

public List<List<Integer>> resList = new ArrayList<List<Integer>>();
public void checkFun02(TreeNode node) {
        if (node == null) return;
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        que.offer(node);

        while (!que.isEmpty()) {
            List<Integer> itemList = new ArrayList<Integer>();
            int len = que.size();

            while (len > 0) {
                TreeNode tmpNode = que.poll();
                itemList.add(tmpNode.val);

                if (tmpNode.left != null) que.offer(tmpNode.left);
                if (tmpNode.right != null) que.offer(tmpNode.right);
                len--;
            }

            resList.add(itemList);
        }
}

    

4.求树的最大高度

/**
     * 递归法
     */
    public int maxdepth(treenode root) {
        if (root == null) {
            return 0;
        }
        int leftdepth = maxdepth(root.left);
        int rightdepth = maxdepth(root.right);
        return math.max(leftdepth, rightdepth) + 1;

    }


/**
     * 迭代法,使用层序遍历
     */
    public int maxdepth(treenode root) {
        if(root == null) {
            return 0;
        }
        deque<treenode> deque = new linkedlist<>();
        deque.offer(root);
        int depth = 0;
        while (!deque.isempty()) {
            int size = deque.size();
            depth++;
            for (int i = 0; i < size; i++) {
                treenode poll = deque.poll();
                if (poll.left != null) {
                    deque.offer(poll.left);
                }
                if (poll.right != null) {
                    deque.offer(poll.right);
                }
            }
        }
        return depth;
    }

到了这里,关于JAVA 基础算法汇总(持续更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 算法宝典——Java版本(持续更新)

    注:由于字数的限制,我打算把算法宝典做成一个系列,一篇文章就20题!!! 目录 一、链表的算法题(目前10道) 1. 移除链表元素(力扣;思路:前后指针) 2. 反转一个单链表 (力扣;思路:头插法) 3. 链表的中间结点(力扣;思路:快慢指针) 4. 链表中倒数第k个结点

    2024年02月09日
    浏览(45)
  • 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中。。。。。。 第一章高精度计算 1307【例1.3】高精度乘法 1308【例1.5】高精除 1309【例1.6】回文数(Noip1999) 1168大整数加法 1169大整数减法 1170计算2的N次方 1171大整数的因子 1172求10000以内n的阶乘 1173阶乘

    2024年02月16日
    浏览(49)
  • 算法面试-深度学习基础面试题整理-AIGC相关(2023.9.01开始,持续更新...)

    1、stable diffusion和GAN哪个好?为什么 ? Stable diffusion是一种基于随机微分方程的生成方法,它通过逐步增加噪声来扰动原始图像,直到完全随机化。然后,它通过逐步减少噪声来恢复图像,同时使用一个神经网络来预测下一步的噪声分布。Stable Diffusion的优点是可以在连续的潜

    2024年02月10日
    浏览(48)
  • 个人博客目录(持续更新中)

            博主是一个业余的matlab选手,平时会在博客上发一些matlab有关的学习资料和电气专业的论文复现。写这篇博客目录是为了方便大家检索。         博客中包括了免费博客和付费博客,不同之处如下:         免费博客主要是我自己学习过程中的我自己的整理总

    2024年02月14日
    浏览(39)
  • 线性DP题目汇总(持续更新)

    此篇章主要整理一些关于线性dp的题目,很多题目其实都可以被挂上线性dp的标志,比如最熟悉的最长上升子序列啊,最长公共子序列啊等等,并且线性dp在自己写力扣周赛的题目的时候,真的会时不时出几道,然后刚好利用这些题目加上dp分析的方法,把题目好好写一写。 ①

    2023年04月08日
    浏览(36)
  • 安全行业招聘信息汇总——持续更新!

    (1)安全攻防工程师 职位描述 1、负责上线安全测试(黑盒、白盒)、例行安全检查、渗透测试、APP安全测试等工作; 2、制订研发流程中的安全规范,监督和保障安全规范的实施; 3、负责SDLC流程落地,深入业务技术及架构,左移解决安全风险; 4、对标国际信息安全最佳

    2024年02月05日
    浏览(46)
  • 【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~

    🍺🍺 各位读者朋友大家好!得益于各位朋友的支持和关注,我的专栏《Java基础教程》 至今已经更新完毕,我们一起探索了Java语言的许多核心概念和重要特性。在过去的文章中,我们 一共涉及了入门知识介绍、编程基础概念、面向对象OOP、包及访问控制权限、异常处理篇、

    2024年02月16日
    浏览(43)
  • 2022前端面试题汇总(持续更新中~)

    目录 1. 防抖和节流 2. js闭包 vue中的data为什么是一个函数?(面试常问) 3. ES6面试题 3.1 var let const 区别 3.2 解构  3.3 如何利用es6快速的去重? 3.4 Promise 面试题 以下代码的执行结果是? 4. Vue相关 4.1 MVC和MVVM的区别 4.2 v-model 原理 4.3  vue中的data为什么是一个函数?(面

    2023年04月08日
    浏览(68)
  • Hyperledger Fabric问题汇总(持续更新)

    Ubuntu 20.04 Hyperledger Fabric 2.3.3 SDK对应的Go 1.17.5 链码对应的Go 1.18 Fabric-sdk-go 1.0.0 Docker 20.10.12 Docker-Compose 2.11.2 调用命令: peer chaincode invoke -o localhost:7050 – ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts

    2023年04月15日
    浏览(45)
  • 深度学习常见模型大小汇总(持续更新...)

    本篇博客将记录深度学习领域常见模型的大小,具体算法如下 模型可能来自于PyTorch官方,HuggingFace等。 如有错误或者建议欢迎在评论区指出。 第三方库 版本 transformers 4.30.2 PyTorch 2.0.1 Encoder-Only架构 模型 来源 总参数量 总参数量 BERT-base HuggingFace 109,482,240 109.5M BERT-large Huggin

    2024年02月13日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包