数据结构与算法
这里面是常见的一些数据结构与算法题,按照分类依次刷题,里面给了我理解的最详细的解释,如有考虑不周到之处,望诸君指正,一起学习,里面的代码够可以在牛客网上运行
码农秃头老李
人这一辈子这么长,希望留一些值得有价值的东西证明自己在这个世界上来过。
展开
-
在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回[-1, -1]。例如:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]解析://解法一:二分查找public class Solution { public int[] searchRange(int[] nums, int target) { int len.原创 2020-12-01 13:46:19 · 91 阅读 · 0 评论 -
两个数组的交集 II[letcode350]
题目描述:给定两个数组,编写一个函数来计算它们的交集。示例一:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]实例二:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]// 由于同一个数字在两个数组中都可能出现多次,因此需要用哈希表存储每个数字出现的次数。对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值。//首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以.原创 2020-11-24 17:07:00 · 65 阅读 · 0 评论 -
给出一个完全二叉树,求出该树的节点个数。
题目描述:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~2^h个节点。输入: 1 / \ 2 3 / \ /4 5 6输出: 6例如此二叉树:最低层没有填满,并且最下面一层的节点都集中在该层最左边的若干位置。从图可以看出最底层为2层,则该层最多为1~4个节点。对于任意二叉树可以有的解法是遍历根节点的左子树和根节点的右..原创 2020-11-24 10:18:14 · 697 阅读 · 0 评论 -
[异或运算]认识异或运算
基础知识:异或运算:相同为0,不同为1同或运算:相同以1,不同为0能长时间记住的概率接近0%所以,异或运算就记成无进位相加!异或运算的性质0^N == N N^N == 0异或运算满足交换律和结合率上面的两个性质用无进位相加来理解就非常的容易1.如何不用额外空间交换两个数据?public static void swap (int[] arr, int i, int j) { // arr[0] = arr[0] ^ arr[0]; arr[i]原创 2020-11-16 22:38:30 · 2181 阅读 · 0 评论 -
[二分法]二分法的常见题型
认识二分法经常见到的类型是在一个有序数组上,开展二分搜索,但有序真的是所有问题求解时使用二分的必要条件吗?只要能正确构建左右两侧的淘汰逻辑,你就可以二分。二分常见题型1>在一个有序数组中,找某个数是否存在public static boolean exist(int[] sortedArr, int num) { if (sortedArr == null || sortedArr.length == 0) { return false; } int L =.原创 2020-11-16 21:54:45 · 689 阅读 · 0 评论 -
[二叉树]二叉树的序列化和反序列化
题目:二叉树被记录成文章的过程叫做二叉树的序列化,通过文件的内容重建原来的二叉树的过程叫做二叉树的反序列化。给定一颗二叉树的头节点head,并已知二叉树的节点值的类型为32位整型。请设计一种二叉树序列化和反序列化的方案,并用代码实现。...原创 2020-11-14 09:52:04 · 144 阅读 · 0 评论 -
[二叉树]分别用递归和非递归方式实现二叉树先序、中序和后序遍历
题目:用递归和非递归两种方式,分别按照二叉树先序、中序和后序打印所有的节点。我们约定先遍历顺序为根、左、右;中序遍历顺序为左、根、右;后序遍历为左、右、根。前提知识:递归的遍历:树的遍历与递归最近做一个统计工作,需要遍历一些文件,一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?相信很多人第一时间都能想到递归遍历,这是最直接,最简单的办法。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧...原创 2020-11-13 08:39:37 · 547 阅读 · 1 评论 -
[数组]顺时针旋转矩阵[猿辅导,华为]
题目:有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。例如:输入:[[1,2,3],[4,5,6],[7,8,9]],3输出:[[7,4,1],[8,5,2],[9,6,3]]解答:矩阵转换90度,则原矩阵的纵下标转变为新矩阵的横下标;原矩阵的横下标转变为新矩阵的纵下标,并且顺序相反。import java.util.*;public class Rotate { publi原创 2020-11-04 08:43:02 · 221 阅读 · 0 评论 -
[数组]合并区间[猿辅导,华为]
题目:给出一组区间,请合并所有重叠的区间。例如:输入[[10,30],[20,60],[80,100],[150,180]],输出:[[10,60],[80,100],[150,180]],解释:[10,20]与[20,60]有重叠,所以合并为[10,60]解答:关键:先根据各区间的起点,对二维数组进行排序步骤:先根据各区间的起点,对二维数组进行排序 排好序后就遍历各区间并将各区间合并。由于已经排好序,所以要将某区间合并进去的时候,只需考虑上一个合并好的区间即可。import ja原创 2020-11-03 08:35:24 · 269 阅读 · 0 评论 -
[数组]螺旋矩阵[微软、小米]
题目:给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。例如:输入:[[1,2,3],[4,5,6],[7,8,9]],输出:[1,2,3,6,9,8,7,4,5]解答:螺旋矩阵的思路:定义上下左右四个方向 左方向的初始值就是二维数组的最左一列下标(left) 右方向的初始值就是二维数组的最右一列下标(right) 上方向的初始值就是二维数组的最上一行下标(top) 下方向的初始值就是二维数组的最下一...原创 2020-11-03 08:02:57 · 145 阅读 · 0 评论 -
[数组]数组中相加为0的三元组[百度、携程]
题目:给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。 例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)解答:首先要判断数组num是否为空 将数组排序,(排序有多种方法) 遍历数组,分析题目可知,三个数相加等于零,此时的数组num已经是排过序的,由原创 2020-11-02 08:46:35 · 197 阅读 · 0 评论 -
[数组]调整数组顺序使奇数位于偶数前[百度,深信服]
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解答:1.时间复杂度为O(n),空间复杂度为O(1),计算出数组的长度;2.计算的array[even] 是奇数的话,temp = array[even]public class Solution { public void reOrderArray(int [] array) { if(null原创 2020-11-01 14:58:59 · 132 阅读 · 0 评论 -
[数组]买股票的最佳时机[亚马逊、远景能源]
题目:假设你有一个数组,其中第i个元素是股票在第i天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。import java.util.*;public class Solution { /** * * @param prices int整型一维数组 * @return int整型 */ public int maxProfit (int[] prices) { ..原创 2020-10-31 10:00:17 · 195 阅读 · 0 评论 -
[数组]斐波那契数列[西门子,金山云]
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39这次比较简单可以直接写成答案即可常见的解法:递归这里限制了n<=39,所以不会内存溢出,但是n无穷大的话可能会内存溢出public class Solution { public int Fibonacci(int n) { if(n > 39) return -1; if(n==0) return 0;原创 2020-10-30 21:07:08 · 119 阅读 · 0 评论 -
[数组、哈希]两数之和[快手,百度]
题目:给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2import java.util.*;public class Solution { /** * .原创 2020-10-30 20:48:09 · 136 阅读 · 0 评论 -
[数组]合并两个有序数组[快手,美团点评考过]
题目:给出两个有序的整数数组 A和 B,请将数组 B合并到数组 A中,变成一个有序的数组注意:可以假设 A数组有足够的空间存放 B数组的元素, A和 B中初始的元素数目分别为 m和 n解答:1.首先A足够大可以容纳B中的元素,所以我们不可以从前向后比较A,B的元素,因为这可能会破坏A原本的数组结构,例如:A{2,4,5,6,7},B{1,4,8,9}从前向后比较时:比较A和B数组中的第一个元素1<2,就会把A中的2替换成1,所以这样是不可取的的,因为两个数组都是有序排列的,我们可以从后往前比较原创 2020-10-30 08:34:18 · 377 阅读 · 0 评论 -
[链表]19.划分链表[字节跳动]
题目:给出一个链表和一个值,以 X为参照将链表划分成两部分,使所有小于X的节点都位于大于或等于X 的节点之前。两个部分之内的节点之间要保持的原始相对顺序。例如:给出 1→4→3→2→5→2和 x=3,返回 1→2→2→4→3→5....原创 2020-10-29 19:41:04 · 123 阅读 · 0 评论 -
[链表]18.重排链表[字节跳动]
题目:将给定的单链表\ LL:L_0→L_1→…→L_{n-1}→L_ nL0→L1→…→Ln−1→Ln重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0→Ln→L1→Ln−1→L2→Ln−2→…要求使用原地算法,不能改变节点内部的值,需要对实际的节点进行交换。例如:对于给定的单链表{10,20,30,40},将其重新排序为{10,40,20,30}....原创 2020-10-29 19:45:58 · 266 阅读 · 0 评论 -
[链表]16.删除链表中重复的元素[猿辅导、招银网络]
题目:删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次例如:给出的链表为1→1→2,返回1→2.给出的链表为1→1→2→3→3,返回1→2→3.原创 2020-10-28 18:53:25 · 173 阅读 · 0 评论 -
[链表]15.删除有序链表中重复出现的元素[招银网络、美团点评]
题目:给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。例如:给出的链表为1→2→3→3→4→4→5, 返回1→2→5.给出的链表为1→1→1→2→3, 返回2→3....原创 2020-10-28 18:48:41 · 102 阅读 · 0 评论 -
[链表]14.链表中倒数第K个节点[乐信、shopee]
题目:输入一个链表,输出该链表中倒数第k个结点。原创 2020-10-28 17:18:11 · 85 阅读 · 0 评论 -
[链表]13.判断一个链表是否是回文结构[网易、昆仑万维]
题目:给定一个链表,请判断该链表是否为回文结构原创 2020-10-28 17:04:22 · 127 阅读 · 0 评论 -
[链表]12.链表的奇偶重排[猿辅导,百度]
题目:给定一个单链表,请设定一个函数,讲链表的奇数位节点和偶数位节点分别放在一起,重排后输出。注意是节点的编号而非节点的数值。原创 2020-10-29 08:44:01 · 311 阅读 · 0 评论 -
[链表]11.链表内指定区间反转[美团点评、触宝]
题目:将一个链表\ mm位置到\ nn位置之间的区间反转,要求时间复杂度O(n) ,空间复杂度 O(1)。例如:给出的链表为1→2→3→4→5→NULL,,,返回NULL1→4→3→2→5→NULL.注意:给出的 m,n满足以下条件:1≤m≤n≤链表长度...原创 2020-10-29 08:19:41 · 124 阅读 · 0 评论 -
[链表]10.合并k个已排序的链表[字节、快手]
题目:合并\ kk个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。原创 2020-10-29 19:11:15 · 879 阅读 · 0 评论 -
[链表]9.两个链表的第一个公共节点[华为,小红书]
题目:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)原创 2020-10-27 16:03:16 · 94 阅读 · 0 评论 -
[链表]8.链表中环的入口节点[阿里巴巴,招银网络]
对于一个给定的链表,返回环的入口节点,如果没有环,返回null拓展:你能给出不利用额外空间的解法么?原创 2020-10-26 22:13:32 · 69 阅读 · 0 评论 -
[链表]7.链表中的节点每k个一组翻转[京东,快手,CVTE]
将给出的链表中的节点每\ kk个一组翻转,返回翻转后的链表如果链表中的节点数不是\ kk的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度\ O(1)O(1)例如:给定的链表是1\to2\to3\to4\to51→2→3→4→5对于\ k = 2k=2, 你应该返回2\to 1\to 4\to 3\to 52→1→4→3→5对于\ k = 3k=3, 你应该返回3\to2 \to1 \to 4\to 53→2→1→4→5...原创 2020-10-26 09:38:23 · 162 阅读 · 1 评论 -
[链表]6.两个链表相加生成相加链表[腾讯,百度考过]
题目:假设链表中每一个节点的值都在 0 - 9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。例如:链表 1为 9->3->7,链表 2为 6->3,最后生成新的结果链表为 1->0->0->0。...原创 2020-10-25 20:28:34 · 746 阅读 · 0 评论 -
[链表]5.合并有序链表[快手,京东考过]
题目:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。原创 2020-10-25 19:00:14 · 111 阅读 · 0 评论 -
[链表]4.删除链表的倒数第n个节点[腾讯,猿辅导考过]
码字不易,希望给个点赞题目:给定一个链表,删除链表的倒数第n个节点并返回链表的头指针例如:给出的链表为:1->2->3->4->5, n= 2. 删除了链表的倒数第n个节点之后,链表变为1->2->3->5.备注:题目保证n一定是有效的请给出请给出时间复杂度为O(n)的算法1删除倒数第n个节点删除倒数第n个节点,那就等于是要我们先找出待删除元素前一个元素,也就是第n-1个节点。聪明的你肯定发现了,我们又把这个问题转化为找链表上的某个节点的问.原创 2020-10-23 08:26:59 · 134 阅读 · 0 评论 -
[链表]3.判断给定的链表中是否有环 扩展: 你能给出空间复杂度O(1)的解法么?[网易互娱,中国移动考过]
码字不易,记得点赞加收藏[链表]判断给定的链表中是否有环 扩展: 你能给出空间复杂度的解法么?[网易互娱,中国移动考过]原创 2020-10-23 08:11:12 · 324 阅读 · 0 评论 -
[链表】2.输入一个链表,反转链表后,输出新链表的表头。[多益,字节考过]
码字不易,记得点赞加收藏题目:输入一个链表,反转链表后,输出新链表的表头。解答:例如:输入1->5->6-->8->null,期待输出8->6->5->1-null1.定义一个ListNode pre = null; ListNode next = null; 定义一个前向节点指向null,一个后向节点指向空2.第一轮:当前pre = null,next = null,head = 1next = head..next (head = 1原创 2020-10-22 23:56:32 · 204 阅读 · 1 评论 -
[链表]1.单链表的选择排序【美团点评考过】
码字不易,记得点赞加收藏题目:给定一个无序单链表的头节点head,实现单链表的选择排序。要求:额外空间复杂度为O(1)。解答:既然要求额外空间复杂度为O(1),就不能把链表装进数组等容器中排序,排好序之后再重新连接。选择排序是从未排序的部分中找到最小值,然后放在排好序部分的尾部,逐渐将未排序的部分缩小,最后全部变成排好序的部分。1.开始时默认为整个链表都是未排序的状态,对于找到的第一个最小值节点,肯定是整个链表的最小值节点,将其设置为新的头节点newHead。2.每次在未排序的部分中找到原创 2020-10-22 23:21:15 · 186 阅读 · 0 评论