算法练习
安逸0306
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
jz41 数据流中的中位数
需要注意的是,使用两个堆,利用两个堆的堆顶解题。思路如下: 将读入的数据分为几乎数量相同的两部分,一部分数字小,另一部分大。小的一部分采用大顶堆存放,大的一部分采用小顶堆存放。这样两个堆的堆顶就是整个数据流中,最中间的两个数。当总个数为偶数时,使两个堆的数目相同,则中位数=大顶堆的最大数字与小顶堆的最小数字的平均值;而总个数为奇数时,使小顶堆的个数比大顶堆多一,则中位数=小顶堆的最小数字。插入的步骤如下: 1.若已读取的个数为偶数(包括0)时,两个堆的数目已经相同,再插入一个数时,应该选一个数插入到原创 2021-12-30 10:35:57 · 155 阅读 · 0 评论 -
jz51 数组中的逆序对
public class Solution { /* 思路: 归并排序,分治法(divide,merge)。 divide用mergeSort递归方法实现。 可以举{1,2,3,4,5,6,7,0}的例子 1.先分割为单个元素,然后再排序拼起来 2.在merge中,需要temp数组来进行当前的排序 用i,j指针来进行排序。小的放前面。 如果前面的大,说明这就是一队逆序数。 i,j超出范围后,剩下都是大的,直接.原创 2021-12-29 10:54:34 · 299 阅读 · 0 评论 -
jz44 数字序列中某一位的数字java
序列中的1位数是 0~9 ,共10个。1001 大于 1 * 10 ,因此,这个数一定在0 ~ 9 之后;序列中的2位数是 10 ~ 99 ,共90个。(1001 - 1 * 10) = 991 大于 2 * 90,因此,这个数一定在 10 ~ 99 之后;序列中的3位数是 100 ~ 999,共900个。(1001 - 1 * 10 - 2 * 90) = 811 小于 3 * 900,因此,这个数一定在 100 ~ 999 之间;解题步骤1.确定所求数位的所在数字的位数2.确定所求数位所在的原创 2021-12-29 09:50:16 · 363 阅读 · 0 评论 -
jz53 升序数组中的元素出现的个数
public class Solution { public int GetNumberOfK(int [] array , int k) { int lbound = 0; int rbound = 0; //寻找上界限 int l = 0; int r =array.length; while(l<r){ int mid = l+(r-l)/2; i.原创 2021-12-24 13:00:01 · 3413 阅读 · 0 评论 -
jz 59 滑动窗口的最大值
一:暴力法import java.util.*;public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { ArrayList<Integer> res = new ArrayList<>(); if(num.length==0||size>num.length||size==0){原创 2021-12-24 11:45:49 · 124 阅读 · 0 评论 -
jz73 翻转单词
public class Solution { public String ReverseSentence(String str) { String[] strList = str.split(" "); String result = ""; for(int i=strList.length-1; i>=0; i--) { result += " " + strList[i]; } re.原创 2021-12-24 10:49:37 · 173 阅读 · 0 评论 -
jz31 栈的压入,弹出序列
直接模拟即可。因为弹出之前的值都会先入栈,所以这里用个栈来辅助。初始化:用指针i指向pushV的第一个位置, 指针j指向popV的第一个位置 如果pushV[i] != popV[j], 那么应该将pushV[i]放入栈中, ++i 否则,pushV[i]==popV[j], 说明这个元素是放入栈中立马弹出,所以,++i, ++j,然后应该检查popV[j] 与栈顶元素是否相等,如果相等,++j, 并且弹出栈顶元素 4,重复2,3, 如果i==pushV.size(), 说明入栈序列访问完,此时原创 2021-12-24 10:09:04 · 200 阅读 · 0 评论 -
jz68 二叉树的公共祖先
思路:创建一个hashmap中 k为当前节点, v为该节点的祖先然后创建一个set 里面存放 第一节点的所有父节点最后在set中找第二个节点的父节点import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = v原创 2021-12-23 11:21:10 · 455 阅读 · 0 评论 -
jz84 二叉树中和为某一值的路径(递归+回溯)
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点2.总节点数目为n3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)数据范围:0<=n<=10000<=n<=1000-10^9<=节点值<=10^9−109<=节点值<=109假如二叉树root为{1,2,3,4,5,4,3原创 2021-12-23 10:55:33 · 136 阅读 · 0 评论 -
jz78 将二叉树打印成多行
import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { ArrayList<ArrayList<Integer> &.原创 2021-12-23 10:08:28 · 287 阅读 · 0 评论 -
jz28 对称的二叉树
描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如: 下面这棵二叉树是对称的下面这棵二叉树不对称。思路:递归/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val ...原创 2021-12-23 09:29:46 · 332 阅读 · 0 评论 -
jz8 二叉树的下一个节点(中序)
import java.util.*;/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; }}*/public class Solution { ArrayLis.原创 2021-12-22 12:51:35 · 105 阅读 · 0 评论 -
jz79 判断是否为平衡二叉树
public class Solution { public boolean IsBalanced_Solution(TreeNode root) { int dept = dept(root); if(dept>=0) return true; return false; } public int dept(TreeNode root){ if(root==null) return 0; .原创 2021-12-22 11:51:33 · 315 阅读 · 0 评论 -
jz36 二叉搜索树与双向链表
/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { TreeNode cur =null; TreeNode head=null; public TreeN.原创 2021-12-22 11:17:52 · 407 阅读 · 0 评论 -
jz34 二叉树和为某一值的路径
import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { ArrayList<ArrayList<Intege.原创 2021-12-22 10:56:22 · 232 阅读 · 0 评论 -
jz 82 二叉树中和为某一值的路径(到叶子节点路径)
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n思路:回溯法1、首先,深度优点遍历来说,先写上一个回溯 if (curNode == null) { return false; },这表示递归至最深层开始回溯,至于为什么 return false 后面再讲2、每次进原创 2021-12-22 09:38:18 · 185 阅读 · 0 评论 -
jz33 二叉树的后续遍历序列
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { int len = sequence.length; if(len==0) return false; return help(sequence,0,len-1); } private boolean help(int [] sequence,int st.原创 2021-12-21 11:59:06 · 83 阅读 · 0 评论 -
jz32 从上到下打印链表
import java.util.ArrayList;import java.util.Queue;import java.util.*;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Sol.原创 2021-12-21 11:28:07 · 86 阅读 · 0 评论 -
jz27 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。比如:源二叉树镜像二叉树思路:每次都是交换根节点下面 的二个左右节点import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; *原创 2021-12-21 11:05:16 · 254 阅读 · 0 评论 -
jz26 树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构思路:递归的思想1.先遍历树pRoot1,如果遍历到和pRoot2节点值相同的节点,进入isSubTree方法判断接下来的节点是否都相同2.节点都相同返回True;不相同返回False,并且继续遍历树pRoot1找下一个相同的节点3.如果遍历完了pRoot1还没有返回过True,说明p.原创 2021-12-21 10:24:20 · 186 阅读 · 0 评论 -
jz54 二叉搜索树的第k个节点
描述给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。1.返回第k小的节点值即可2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-13.保证n个节点的值不一样数据范围:0 \le n \le10000≤n≤1000,0 \le k \le10000≤k≤1000,树上每个结点的值满足0 \le val \le 10000≤val≤1000进阶:空间复杂度O(n)O(n),时间复杂度O(n)O(n)如输入{5,...原创 2021-12-21 09:47:25 · 172 阅读 · 0 评论 -
jz77 按之字形顺序打印二叉树
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足|val| <= 100∣val∣<=100要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]示例1输入:{1,2,3,#,.原创 2021-12-20 13:47:28 · 219 阅读 · 0 评论 -
jz55.二叉树的深度
描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。数据范围:节点的数量满足0 \le n \le 1000≤n≤100,节点上的值满足0 \le val \le 1000≤val≤100进阶:空间复杂度O(1)O(1),时间复杂度O(n)O(n)假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:示例1输入:{1,2,3,4,5,#,6,#,...原创 2021-12-20 13:02:52 · 303 阅读 · 0 评论 -
回溯算法 允许重复选择元素的组合
package offer;import java.util.LinkedList;import java.util.List;public class 允许重复选择元素的组合 { public static void main(String[] args) { int [] nums = {2,3,6,7}; System.out.println(combinationSum(nums,7)); } public static List.原创 2021-12-19 13:32:20 · 437 阅读 · 0 评论 -
回溯算法 包含k个元素的组合
给定两个整数n和k,返回1 ... n中所有可能的k个数的组合。输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]package offer;import java.util.LinkedList;import java.util.List;public class 包含k个元素的组合 { public static void main(String[] arg...原创 2021-12-19 12:28:52 · 289 阅读 · 0 评论 -
回溯法求所有子集
给定一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]输入:nums = [0]输出:[[],[0]]package offer;import java.util.LinkedList;import java.util.List;public class 所...原创 2021-12-18 13:09:46 · 683 阅读 · 0 评论
分享