java_算法
算法题目的java实现
Ludwig__
这个作者很懒,什么都没留下…
展开
-
《剑指offer》NO42 连续子数组的最大和 详解 <Java实现>
//题目描述: //输入一个整型数组,数组里有正数也有负数.数组中的一个或多个连续多个 //连续的整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) //{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。public class Solution{ public int findGreatestSumOfArray(int[] nums) { if (num原创 2021-01-17 14:56:29 · 72 阅读 · 1 评论 -
《剑指offer》NO41 数据流中的中位数 大小顶堆实现 详解 <Java实现>
/** * 题目描述 * 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。 * 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 */public class Solution{ //解题思路. //要求中位数,肯定是要排序的,但是数据流回忆只有数据插入,所以不仅要考虑 排序的时间复杂度,还要考虑插入一个新元素的时间复杂度. //因此直接排除掉数组,链表.原创 2021-01-15 21:18:18 · 145 阅读 · 0 评论 -
《剑指offer》NO40 最小的K个数 详解 <Java实现>
//题目描述://输入n个整数,找出其中最小的K的数.例如,输入4,5,1,6,2,7,3,8折8个数,//则最小的4个数字是1,2,3,4.public class Solution{ //解题思路: //要找出最小的K的数,首先考虑到排序,再选出前K个数.但是还不够快.这样的时间复杂度是O(nlogn). //借用快排的思想.只要先找出找出第K小的元素,再用快排,这样K左边就是比K 小的元素.时间复杂度为O(1). //但是要找出第K小的元素也是一个问题.所以直原创 2021-01-05 15:34:18 · 113 阅读 · 0 评论 -
《剑指offer》NO39 数组中出现次数超过一半的数字 详解 <Java实现>
//题目描述: //数组中有一个数字的次数超过数组的长度的一半,请找出这个数字.public class Solution{ //用多数投票算法来做. 并且已经确定了存在一个数符合条件.否则的话还要最后检验这个ans是否符合条件. // 遍历数组,判断ans的次数是否符合条件. // // // 这个ans绝对是数组中出现次数最多的额. /*如果count==0,则将now的值设置为数组的当前元素,将count赋值为1; 反之,如果now原创 2021-01-05 11:50:38 · 68 阅读 · 0 评论 -
《剑指offer》NO36 二叉搜索树与双向链表 详解 <Java实现>
//题目描述//输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。// 解题思路//因为要将二叉搜索树转化成排序的双向链表. 其实转换之后就是 二叉搜索树的中序遍历加上左右指针. 用中序遍历做.//重点的是想到去用 中序遍历 去做. 很方便.public class Solution{ TreeNode pre = null; //定义链表当前结点的上一个结点. TreeNode realHead原创 2021-01-04 20:56:09 · 126 阅读 · 2 评论 -
《剑指offer》NO34 二叉树中和为某一值的路径 详解 <Java实现>
/*题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。*/public class Solution{ //解题思路: //每一次执行过程都相似,且是树结构.因此用递归解决 回溯!!!!. 每一次添加节点的时候,就让target - node.value //递归出口: 失败: 遍历到叶节点 且没有满足条件 target != 0 就返回.原创 2020-12-19 15:55:13 · 1785 阅读 · 5 评论 -
《剑指offer》NO33 二叉搜索树的后序遍历序列 详解 <Java实现>
/* 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。 */ public boolean isPostOrder(int[] sequence) { if (sequence == null || sequence.length == 0) { return false; } return verify(sequence,0,s原创 2020-12-18 21:29:13 · 142 阅读 · 2 评论 -
《剑指offer》NO32.3 之字形从上往下打印二叉树 详解 <Java实现>
public class Solution{ //多了一步判断而已 public ArrayList<ArrayList<Integer>> print(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); ArrayList<ArrayList<Integer>> res = new ArrayList<>原创 2020-12-18 20:15:20 · 108 阅读 · 1 评论 -
《剑指offer》NO32.2 分行从上往下打印二叉树 详解 <Java实现>
/*题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。比上一个多了一个行的条件. */public class Solution{ //把每一层的数据都保存在一个list集合内. ArrayList<ArrayList<Integer>> Print(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>();原创 2020-12-16 21:24:30 · 99 阅读 · 0 评论 -
《剑指offer》NO32.1 从上往下打印二叉树 详解 <Java实现>
/*题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。BFS *///用队列来 实现层次遍历public class Solution{ public ArrayList<Integer> printFromTopToBottom(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); ArrayList<Integer&原创 2020-12-16 21:02:22 · 104 阅读 · 0 评论 -
《剑指offer》NO31 栈的压入弹出序列 详解 <Java实现>
/*题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。*///解题思路://用栈来解决.用来模拟入栈.//如果出栈序列头元素等于栈的栈顶元素 那么就出栈,不想等的话就元素入栈.直到与出栈序列的头元素相等,//全部元素入栈则结原创 2020-12-16 20:09:38 · 137 阅读 · 2 评论 -
《剑指offer》NO30 包含min函数的栈 详解 <Java实现>
/*题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。*/ //定义两个栈,一个用来正常的存储数据,一个专门来保存最小值. private Stack<Integer> dataStack = new Stack<>(); private Stack<Integer> minStack = new Stack<>(); //最小堆中只保存了最小的节点,每次往栈中添加节点的时候就需要比较一次,原创 2020-12-12 20:42:30 · 85 阅读 · 0 评论 -
《剑指offer》NO29 顺时针打印矩阵 详解 <Java实现>
public ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> res = new ArrayList<>(); //定义行与列的做大最小值 int r1 = 0, r2 = matrix.length - 1; int c1 = 0, c2 = matrix[0].length - 1; ...原创 2020-12-08 18:08:52 · 181 阅读 · 0 评论 -
《剑指offer》NO27 二叉树的镜像_递归 详解 <Java实现>
//题目描述: //输入一颗树,输出它的镜像树public class Solution{ public TreeNode mirrorTree(TreeNode root) { //节点为空的话什么也不做,返回上一级. if (root == null) { return null; } //不为空的话就进入反转函数,进行左右对调. reverse(root原创 2020-11-30 21:03:03 · 89 阅读 · 0 评论 -
《剑指offer》NO26 树的子结构 详解 <Java实现>
//题目描述 //给出两颗树A, B,判断B是不是A的子结构。public class Solution{ public Boolean HasSubtree(TreeNode root, TreeNode subTree) { //边界条件判断。子树为空的话,返回真。 母树为空的话返回假 if (subTree == null ) return true; if (root == null)原创 2020-11-29 17:00:15 · 107 阅读 · 0 评论 -
《剑指offer》NO25 合并两个排序的链表 详解 <Java实现>
//题目描述: //输入两个递增排序的链表,合并这两个链表并使新的链表中的节点仍然是递增排序的public class Solution{ public ListNode merge2(ListNode listNode1,ListNode listNode2) { //一个为空返回另一个 if (listNode1 == null) return listNode2; if (listNode2 ==原创 2020-11-29 16:03:48 · 110 阅读 · 4 评论 -
《剑指offer》NO24 反转链表 详解<Java实现>
public class Solution{ //头插法实现 public ListNode reverseList(ListNode head) { //边界条件 传入的头节点为空返回空,只有一个节点的话,反转后还是它本身,返回头结点 if (head == null || head.next == null) return head; //定义一个指针来记录前一个节点的地址。 ListN原创 2020-11-29 15:46:35 · 72 阅读 · 0 评论 -
《剑指offer》NO23 链表中环的入口节点 详解 <Java实现>
/题目描述 //一个链表中包含环,请找出该链表的环的入口结点。要求不能使用额外的空间。public class Solution{ //使用快慢指针来解题。快指针一次走两步,慢指针一次一步。因为是环链表,快慢指针总会相遇。 //设慢指针的速度为x,环之前的节点数为t,环的总节点数为r ,相遇时slow在环中走的步数为y // x = t + y; 2x = t + r + y; //2x = 2t + 2y = t + r + y // t + y =原创 2020-11-22 14:36:08 · 84 阅读 · 0 评论 -
《剑指offer》NO22 链表中倒数第K个节点 详解 <Java实现>
//用快慢指针,fast先走K - 1 步之后,慢指针再开始走,当fast到达链表尾部的时候,slow就指向倒数第K个节点。//但是要注意边界条件 //1.链表为空 //2.K为0 //3.Kd大于链表长度。public class Solution{ public ListNode findKthFromTail(ListNode head,int k) { //边界条件 链表为空,或者K为0原创 2020-11-20 20:51:58 · 89 阅读 · 0 评论 -
《剑指offer》NO21 调整数组顺序使奇数位于偶数前面 详解 <Java实现>
public class Solution{ public void modifyArr(int[] arr) { //边界条件,数组为空的情况。 if (arr == null || arr.length == 0) return; //类似于快排,迅速定位到不合法的位置。并且交换位置。 int left = 0; int right = arr.length - 1;原创 2020-11-20 20:29:59 · 717 阅读 · 4 评论 -
Java中数组为空和数组长度为0的区别
做算法题的时候经常遇到if (arr == null || arr.length == 0) return;想了下为什么要这样写。int[] array = null; 数组为空,此时array不指向任何对象;int[] array = new array[0]; 定义一个长度为0的数组;一般先判断 array 是否为null,因为可能报空指针异常。然后再判断array长度是否为0。所以一般这样写:if(array == null || array.length == 0)因为 || 是原创 2020-11-18 21:25:19 · 842 阅读 · 0 评论 -
《剑指offer》NO18.2 删除链表中重复的节点 详解 <Java实现>
public class Solution{ public ListNode deleteDulplicationNode(ListNode head) { //不可能有重复节点的情况。直接返回head; if (head == null || head.next == null) return head; ListNode next = head.next; //有重复的情况要考虑 头节点是否重复原创 2020-11-15 15:44:12 · 117 阅读 · 0 评论 -
《剑指offer》NO18.1 在O(1)时间内删除链表节点 详解 <Java实现>
//题目描述: //给定单项链表的头节点和一个节点的指针,定义一个函数在O(1)时间内上删除该节点。//解题思路: //常规的删除操作是遍历整个链表,找到要删除的节点和他的前一个节点,把前一个节点的next指向要删除节点的下一个节点。这样做到了删除操作。 //但是这样的时间复杂度为O(n);因为链表自带下一个节点的地址,所以我们能够立即找到目标节点的下一个节点next。用下一个节点next把目标节点覆盖; //这样就能立马做到删除操作原创 2020-11-15 14:53:04 · 103 阅读 · 0 评论 -
《剑指offer》NO17 打印从1到最大的n位数 详解 <Java实现>
//题目描述// 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。// 比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。public class Solution{ //本来这道题很简单的。 // 但是由于 n 没有规定大小,所以必须按照大数来处理。 //最常用也是最容易的方法就是使用字符串或者数组来表示大数。 //但是用字符串的话 需要模拟整数的加法,比较麻烦。下面用数组来做。 public vo原创 2020-11-15 14:12:34 · 62 阅读 · 0 评论 -
《剑指offer》NO14 剪绳子 两种方法实现详解 <Java实现>
题目描述把一根绳子剪成多段,并且使得每段的长度乘积最大。贪心算法//贪心算法 时间复杂度O(1) 空间复杂度O(1) //解题思路 //当 n >= 5 时,可以证明 2(n - 2) > n 并且3(n - 3) > n,所以说当绳子剩下的长度大于或者等于5的时候 //我们就把他剪成长度为3或者为2的绳子段。同时,3(n - 3) >= 2(n - 2) //所以我们应该尽可能去多剪长度为3的绳子段。原创 2020-11-09 14:55:30 · 181 阅读 · 2 评论 -
剑指offer No 13 机器人的运动范围 详解
和第12题 <矩阵的路径> 一样的思路/*题目描述 地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动, 每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。 但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子?*/public class S原创 2020-11-08 20:57:21 · 111 阅读 · 0 评论 -
剑指offer NO12 矩阵中的路径 详解
public class Solution{ //定义的是每次行走的方向。 private final static int[][] next = { {0,-1},{0,1},{1,0},{-1,0} }; //用来记录二位数组的行与列 private int rows; private int cols; public boolean hasPath(char[] arr, int rows,int cols,char原创 2020-11-07 21:09:21 · 74 阅读 · 0 评论 -
剑指offerNO8二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点在这里插入代码片/*题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点 并且返回。注意,树中的结点不仅包含左右子结点, ***同时包含指向父结点的指针。 */public class Solution{ public TreeNode getNext(TreeNode node) { if (node == null)原创 2020-11-01 19:45:03 · 77 阅读 · 0 评论 -
剑指offerNO35复杂链表的复制,链表的复制思想。
NO35.复杂链表的复制//题目描述//输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,// 另一个特殊指针指向任意一个节点),// 返回结果为复制后复杂链表的 head。public class Solution{ public RandomListNode clone(RandomListNode head) { if (head == null) return null;原创 2020-10-19 15:41:02 · 62 阅读 · 0 评论 -
java两种方法实现倒序打印链表
1.== 头插法实现==public ArrayList<Integer> printReverseListNode1(ListNode listNode) { ListNode head = new ListNode(-1); //创建一个head.next来结点用来保存上一个结点的地址 while (listNode != null) //必须创建head 要不然第一个结点没办法指向上一个节点。 {原创 2020-10-18 18:16:30 · 424 阅读 · 0 评论 -
利用队列来实现树的层次遍历
利用队列来实现树的层次遍历ArrayList<ArrayList<Integer>> Print(TreeNode root){ ArrayList<ArrayList<Integer>> res = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!que.原创 2020-10-15 19:45:58 · 475 阅读 · 0 评论 -
两种方法实现中序遍历
中序遍历也就是搜索二叉树的排序#剑指offer NO62 二叉搜索树的第K小的值##1.用栈实现中序遍历public TreeNode findKthNode(TreeNode root,int k) NO62.二叉搜索树的第K小的值 { int count = 0; Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; wh原创 2020-10-15 19:33:55 · 1126 阅读 · 0 评论