数据结构和算法
黑蛋先生
这个作者很懒,什么都没留下…
展开
-
链表中环的入口节点
.原创 2022-01-10 16:39:40 · 77 阅读 · 0 评论 -
合并两个有序数组
LeetCode88给你两个按 非递减顺序 排列的整数数组nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。输入:nums1 =.原创 2021-10-07 13:33:37 · 169 阅读 · 0 评论 -
删除链表中指定的节点
示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]实现:public class Test02 { private static class ListNode{ int val; ListNode next; public ListNode(int val){ this.val = val; } @Override publ原创 2021-09-25 13:42:04 · 121 阅读 · 0 评论 -
链表逆序求和
题目:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:1、使用dummy哑节点避免处理头节点为空的边界问题。2、carry表示近位数,通过除10得到3、当前节点的下一个节点通过原创 2021-09-23 17:33:14 · 262 阅读 · 0 评论 -
寻找第K大
题目:给定一个数组[2,5,7,3,8],找到第 k 大的元素方法:使用快排的思想。public class FindKthGreat{ public static void main(String[] args){ int[] arr = {2,5,7,3,8}; System.out.println(findKthGreat(arr, 0, arr.length - 1, 3)); } public static int findKth原创 2021-09-09 20:20:43 · 88 阅读 · 0 评论 -
最长无重复字数组
给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。 子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。示例1输入:[2,3,4,5]返回值:4说明:[2,3,4,5]是最长子数组示例2输入:[2,2,3,4,3]返回值:3说明:[2,3,4]是最长字数组public class maxSubArray{ public static void main(St原创 2021-09-08 20:03:28 · 168 阅读 · 0 评论 -
剑指offer-替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."public class ReplaceSpace{ public static void main(String[] args) { System.out.println(replaceSpace2(new StringBuffer("We Are Happy"))); } public原创 2021-07-31 17:45:01 · 50 阅读 · 0 评论 -
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例 1:输入:strs = ["flower","flow","flight"]输出:"fl"示例 2:输入:strs = ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。分析:1、取出数组中的第一个元素2、for循环遍历剩下的元素,用剩下的每一个元素都去和第一个元素使用indexOf()去判断。public class LongestCom.原创 2021-07-31 15:39:32 · 79 阅读 · 0 评论 -
最长回文串
/** * 最长回文串: * LeetCode: 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注 意:假设字符串的长度不会超过 1010。 * 回文串:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串 * 示例 1: * * 输入: * "abccccdd" * * 输出: * 7 * * 解释: * 我们可以构造的最长的回文串是"dcc.原创 2021-07-31 15:18:42 · 84 阅读 · 0 评论 -
java实现二叉树的层序遍历
核心:利用队列实现二叉树的层序遍历。分析:1、返回值:List<List<Integer>>:内层List存放二叉树节点的值,外层List存放每一层List节点中的值。2、使用Queue存储二叉树的节点。3、先存放根节点,从根节点开始去遍历左右节点。public List<List<Integer>> levelOrder(TreeNode root) { if(root == null) return new A原创 2021-07-29 16:02:53 · 533 阅读 · 0 评论 -
栈实现队列
分析:1、队列是先进先出的,栈是后进先出的。2、想要用栈实现队列,必须是两个栈。一个栈(A)入队列,一个栈(B)出队列。3、入栈就相当于是入队列了。4、关键在于出队列的时候,我们需要用另一个栈B来把栈A的元素颠倒一下,再在栈B中出队列。public class StackImplQueue{ private Stack<Integer> stackA = new Stack<>(); private Stack<Integer>原创 2021-07-28 17:18:05 · 135 阅读 · 0 评论 -
子数组最大平均数
题目:给一个整数数组,找出【平均数最大】且【长度为k】的下标连续 的子数组,并输出该子数组最大平均数。输入:[1,12,-5,-6,50,3],k=4输出:12.75最大平均数:(12-5-6+50)/4 = 51/4 = 12.75分析:典型的滑动窗口问题。1、先统计第一个滑动窗口的和,默认第一个滑动窗口的和最大。2、去掉旧窗口中下标最小的值,引入数组中下一个值,得到新窗口。下一个值指的是:窗口的大小+13、使用Math.max(旧窗口元素和,新窗口元素和) 函数得到.原创 2021-07-28 11:26:54 · 481 阅读 · 0 评论 -
寻找数组的中心下标
题目:给定一个整数数组nums,请编写一个能够返回数组“中心下标”的方法。中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果数组中不存在中心下标,返回-1,如果数组中有多个中心下标,应该返回最靠左边的那一个。注意:中心下标可能出现在数组的两端。思路分析:1、先计算出数组元素的总和。用sum表示。2、从数组中第一个元素开始叠加。用total表示。3、每叠加一个元素,用sum减去叠加的元素,sum的值就会越来越小,直到和total相等。4、最后tot原创 2021-07-27 14:54:51 · 453 阅读 · 0 评论 -
七大排序算法
package com.heidan.test;import java.util.Arrays;public class Review03 { public static void main(String[] args) { int[] arr = {15,35,95,65,75};// bubbleSort(arr);// quickSort(arr,0,arr.length-1);// selectSort(arr);/.原创 2020-12-29 14:32:25 · 81 阅读 · 0 评论 -
反转链表的实现
反转链表一直是一个高频的面试点,今天我用两种方法实现一下:反转链表的核心在于反转,我们反转的并不是数字,而是指向数字的箭头。用上面的图来理解一下:原本的链表:node1.next = node2,那么反转之后就是node2.next = node1,总结一下就是:node1.next.next = node1,不知道大家理解了没有。接下来我们用递归的方法来实现一下:public ListNode reverseList(ListNode head){ if(head == nu原创 2020-11-19 11:14:56 · 188 阅读 · 2 评论 -
稀疏数组
二维数组转稀疏数组的思路:1、遍历原始的二维数组,得到有效数据的个数sum2、根据sum就可以创建稀疏数组sparseArr int[sum+1][3]3、将二维数组的有效数据存入到稀疏数组稀疏数组转原始的二维数组的思路1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr = int[11][11]2、再读取稀疏数组后几行的数据,并赋给原始的二维数组即可。...原创 2020-10-16 14:47:03 · 134 阅读 · 0 评论 -
排序算法之插入排序
插入排序基本思想:将一个数组分为两部分,一部分有序,一部分无序,将无序数组中的元素按其值的大小插入到有序的数组中,知道全部插完为止。public static void insertSort(int[] arr) { //遍历所有的数字 for(int i=1;i<arr.length;i++) { //如果当前数字比前一个数字小 if(arr[i]<arr[i-1]) { //把当前遍历数字存起来 int temp=arr[i]; int原创 2020-10-13 20:28:53 · 56 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序:原理:比较两个相邻的元素,将值大的元素交换到右边。public static void BubbleSort(int[] array){ for(int i=0;i<array.length;i++){ for(int j=i+1;j<array.length;j++){ if(array[i]>array[j]){ int temp = array[i];原创 2020-10-13 19:40:23 · 82 阅读 · 0 评论 -
一些算法问题的思路
实际编程中遇到的问题1、修路问题----->最小生成树【数据结构】+普利姆算法2、最短路径问题------>图+弗洛伊德算法3、汉诺塔问题------->分治算法4、八皇后问题------->回溯法原创 2020-10-13 08:49:09 · 129 阅读 · 0 评论