数据结构与算法
猿-猿
这个作者很懒,什么都没留下…
展开
-
数据结构与算法之---滑动窗口
题目:给定一个整数数组,计算长度为k的连续子数据的最大总和。当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝。求和:减左侧出窗值,加右侧新入窗值 减少重复运算。解法:创建一个大小为k的窗口,窗口从左向右滑动。从而减少重复计算,降低时间复杂度。用于解决数组/字符串的子元素问题。查找满足一定条件的连续区间的问题。原创 2023-01-12 21:02:50 · 236 阅读 · 1 评论 -
数据结构与算法--二叉搜索树节点删除
二叉搜索树的节点删除代码class Solution { public TreeNode deleteNode(TreeNode root, int key) { if (root == null) { return null; } if (key < root.val) { // 待删除节点在左子树中 root.left = deleteNode(root.left, k原创 2021-08-15 13:17:45 · 134 阅读 · 0 评论 -
数据结构与算法--一个数组构建二叉树过程
root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]数组转二叉树如图原创 2021-08-14 21:37:39 · 181 阅读 · 0 评论 -
数据结构与算法--二叉搜索树查找
递归实现 public boolean searchBST(TreeNode root,int value){ // 递归终止条件 if(root==null){ return false; } // 如果当前值和查找值相同返回true if(value==root.val) return true; boolean state = false; // 如果查找值小于根原创 2021-08-10 22:46:12 · 72 阅读 · 0 评论 -
数据结构与算法--二叉搜索树
二叉搜索树如果左子树不为空,则左子树所有节点的值都小于根节点的值。如果右子树不为空,则右子树所有节点的值都大于等于根节点的值。任意一颗子树也是二叉搜索树二叉搜索树的建立// 二叉搜索树的建立 public TreeNode insert(TreeNode root,int value){ // 如果根节点为空,则元素为根节点 if(root == null){ return new TreeNode(value); }原创 2021-08-10 22:24:34 · 162 阅读 · 0 评论 -
数据结构与算法--之树的后序遍历(递归方式)
public List postorderTraversal(TreeNode root) {LinkedList ans = new LinkedList<>();inoder(root,ans);return ans;}public void inoder(TreeNode root,List<Integer> list){ if(root==null)return; inoder(root.left,list); inoder(root.ri原创 2021-07-17 22:54:29 · 165 阅读 · 1 评论 -
数据结构与算法--之树的前序遍历(递归方式)
public List preorderTraversal(TreeNode root) {List list = new ArrayList<>();inoder(root,list);return list;}public void inoder(TreeNode root,List<Integer> list){ if(root==null)return; list.add(root.val); inoder(root.left,list);原创 2021-07-17 22:51:25 · 208 阅读 · 0 评论 -
数据结构与算法--之树的中序遍历(递归方式)
public List inorderTraversal(TreeNode root) {List list = new ArrayList<>();inorder(root,list);return list;}public void inorder(TreeNode root,List<Integer> res){ if(root==null) return; inorder(root.left,res); res.add(root.val);原创 2021-07-17 22:46:02 · 277 阅读 · 0 评论 -
数据结构与算法--之树的后序遍历
public List postorderTraversal(TreeNode root) {LinkedList ans = new LinkedList<>();//特殊判断if(root == null)return ans;Deque stack = new ArrayDeque<>();//加入根节点,既然根节点第一个出来,那顺序就是反的。可以采取头插法,这样最终的顺序就是正确的stack.push(root); while (!stack.isEmp原创 2021-07-17 22:41:32 · 116 阅读 · 0 评论 -
数据结构与算法--之树遍历概念
前序遍历:1.访问根结点。2.以前序遍历方式遍历根结点的左子树。3以前序遍历方式遍历根结点的右子树。中序遍历:1.以中序遍历方式遍历根结点的左子树。2.访问根结点3.以中序遍历方式遍历根结点的右子树。后序遍历:1.以后续遍历方式遍历根结点的左子树。2.以后续遍历方式遍历根结点的右子树。3.访问根结点。...原创 2021-07-17 21:53:36 · 91 阅读 · 0 评论 -
数据结构与算法--之树
二叉树的定义:每个结点最多有两个子树且左右子树的顺序不能调换。满二叉树:如果二叉树中任意一个结点。或者是叶结点,或者有两个非空子树,且叶结点都集中在树的最下面一层。完全二叉树:若二叉树最多只有最下面两层结点的度可以小于2,且最小面一层的结点都依次排列在该层最左边的位置上。...原创 2021-07-17 21:46:14 · 93 阅读 · 0 评论 -
数据结构与算法--之树的前序遍历
public List preorderTraversal(TreeNode root) {// 保存树值的集合List list = new ArrayList<>();// 用栈保存遍历的树的节点Stack stack = new Stack<>(); while (root!=null || !list.isEmpty()){ // 遍历树的左子树 while (root!=null){ list.add(原创 2021-07-17 21:30:22 · 126 阅读 · 1 评论 -
数据结构与算法--之树的中序遍历
public List<Integer> inorderTraversal(TreeNode root) { // 记录目标序列 List<Integer> list = new ArrayList<>(); // 显示模拟栈 Stack<TreeNode> stack = new Stack<>(); // 判断节点是否被访问完 // 处理二叉树为空.原创 2021-07-15 23:24:08 · 198 阅读 · 3 评论 -
数据结构与算法--之DFS 深度优先搜索算法
树的DFS 深度优先搜索算法 通过递归获取左 右子树的最大深度加上当前根节点即为树的最大深度public int maxDepth(TreeNode root) { // 递归三要素 // 1.结束条件 if(root ==null) return 0; // 2.函数主功能。分别求左右子树最大深度,返回左右子树深度最大值 int left = maxDepth(root.left);原创 2021-07-04 21:12:27 · 98 阅读 · 0 评论 -
数据结构与算法--之BFS 广度优先搜索算法
树的BFS 广度优先搜索算法。遍历获取每一层的数据。然后获取树的最大深度 public int maxDepth(TreeNode root) { if(root == null) return 0; // 考虑书为空的情况下 BFS无法自动处理 Queue<TreeNode> queue = new LinkedList<>(); // 使用队列来记录各层几点 queue.offer(root); // 根节原创 2021-07-04 20:59:24 · 117 阅读 · 0 评论 -
数据结构与算法--二分查找算法
二分查找是折半查找,根据中间值一分为二。如果目标值大于中间值,那么就舍弃左边的从中间值的右边查找。如果目标值小于中间值,那么就舍弃右边的从中间值开始左边查找。注意:二分查找的集合一定是有序的 /** * 二分查找算法 * @param key * @param a * @param start * @param end * @return */ public static int binarySearch(int key,int原创 2021-06-10 22:59:55 · 57 阅读 · 3 评论 -
数据结构与算法--归并排序
归并排序 和快速排序差不多,性能没有快速排序好。但是它是稳定排序(稳定排序:集合中相等的元素在排序前后相对顺序保持不变)下面代码就是将一个大的数组通过分治思想分解为一个个小的数组。直到数组中只有一个为止。然后依次从小的数组合并为一个大的数组返回。就达到了排序的目的。 /** * 归并排序 * @param arr * @return */ public static int[] mergeSort(int[] arr){ // 结束条件原创 2021-06-10 22:48:17 · 48 阅读 · 0 评论 -
数据结构与算法--递归
// 递归: 先递后归 public static int recursion(int number){ // 结束条件 if(number==1){ return 1; } // 函数主体 System.out.println(number); // 递归表达关系式 return number*recursion(number-1); }...原创 2021-05-12 09:16:14 · 72 阅读 · 0 评论 -
数据结构与算法--冒泡排序
// 外层循环length-1 for(int i =0;i<ss.length-1;i++){ // 内存循环length-i-1,这样是因为每次排序后最大的都会沉到最后面 length-i-1 就不用在对已经排过序的排序了 for (int j=0;j<ss.length-i-1;j++){ if(ss[j]>ss[j+1]){ int tem...原创 2021-05-12 08:58:10 · 63 阅读 · 0 评论 -
数据结构与算法--插入排序
// 外层循环是待排序的元素 for (int i =1;i<arr.length;i++){ int temp = ss[i]; // 内存循环是已排序的元素,新元素两两比较后,大的沉到最后面。 for(int j=i-1;j>=0;j--){ if(ss[j]>temp){ ss[j+1]=ss[j]; .原创 2021-05-12 08:55:27 · 71 阅读 · 0 评论 -
数据结构与算法-快速排序
1.查找基准值2.递归处理左子区3.递归处理右子区public static void quickSort(int[] arr,int low,int high){int i =low;int j = high;int temp = arr[i];// 找基准值while (i<j){while(i<j && arr[j]>=temp){ // arr[j]比基准值大继续向前搜索j–;}if(i<j){arr[i++]=arr[j];原创 2021-05-12 08:51:07 · 122 阅读 · 0 评论 -
二进制和十进制的转换and位运算
数码:使用的数字符号 比如 十进制的1 2 3 4 5 6等。二进制的 0 1基数: 每个进制的基数 比如十进制是10 二进制是2二进制的位权:固定位置对应的单位值。比如一个数字从右往左从0开始递增1.将二进制数转换成十进制转换规则: 展开位权进行求和运算1001101x2^5+0x2^4+0x2^3+1x2^2+1x2^1+0x2^01x32+0x16+0x8+1x4+1x2+0x132+0+0+4+2+0结果=382.将十进制转换为二进制转换规则:除2取余直至运算结果为0,将余数原创 2021-01-30 11:02:13 · 3647 阅读 · 0 评论