![](https://img-blog.csdnimg.cn/20201230131957803.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
牛客题霸算法篇
牛客题霸算法篇刷题积累
学而不思则忘
一切都可以
展开
-
设计getMin功能的栈——自写链表实现
题目描述实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。输入:[[1,3],[1,2],[1,1],[3],[2],[3]]输出:[1,2]import java.util.*;public class Solution { /** * return a array which include all ans for op3 * @param op int整型二维数组 operator * @return int整型一维原创 2021-04-02 15:21:42 · 77 阅读 · 0 评论 -
根据二叉树前序和中序结果建立二叉树,并输出右视图
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */.原创 2021-04-02 15:16:50 · 371 阅读 · 0 评论 -
最长递增子序列
题目描述给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)输入[1,2,8,6,4]输出[1,2,4]题解采用贪心+二分,假设数组arr为[1,2,8,6,4],end数组里面存放递增子序列,maxLen数组里存放以元素i结尾的最大递增子序列长度,那么遍历数组arr并执行如下更新规则:初始情况下,end为[1], maxLen为[1]然后遇到2,由于end的最后一个元素小于2,所以直接把2添加到end最后,maxLen也更新,此时:原创 2021-04-01 16:42:51 · 328 阅读 · 0 评论 -
容器盛水问题——NC.128
题目描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。解题思路:确定双边界,然后双指针从两侧计算如果左侧边界小于右侧边界,则左指针i++,然后计算当前i处的存水量,以左边界为基准。如果当前处比左边界大,则替换左边界为当前处。否则,计算当前存水量。如果右侧边界小于左侧边界,则右指针j--,然后计算当前j处的存水量,以右边界为基准。如果当前处比右边界大,则替换右边界为当前处。否则,计算当前存水量。import java.util.*;原创 2021-02-05 22:44:33 · 429 阅读 · 0 评论 -
最长回文子串——NC.17
题目描述对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。import java.util.*;public class Solution { public int getLongestPalindrome(String A, int n) { // write code here int res = 0; // 记录当前从i到j是否为回文子串 boole原创 2021-02-05 22:11:38 · 293 阅读 · 0 评论 -
数组中相加和为0的三元组——NC.54
题目描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。 注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。 例如,给定的数组 S = {-10 0 1020 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)解题思路:三个数相加,可以转化为两个数相加的场景。解决这类数组问题,可以先对数组进行排序,这样相当于多了一个隐含条件。遍历数组中的每个数据,然后使用双指针原创 2021-02-05 15:51:20 · 548 阅读 · 0 评论 -
在转动过的有序数组中寻找目标值——NC.48
题目描述给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。 假设数组中不存在重复项。解决思路:先寻找到断点,即以此断点分开的两段都是有序数组。然后再使用二分查找。import java.util.*;public class Solution { /** * * @param A int整型一维数组原创 2021-02-05 12:12:17 · 225 阅读 · 0 评论 -
斐波那契数列——NC.65
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n≤39递归 VS 动态规划首先看递归:public class Solution { public int Fibonacci(int n) { if (n < 2) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); }}然后是动态规划public c原创 2021-01-28 22:35:05 · 172 阅读 · 1 评论 -
字符串的排列——NC.121
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。/*** 1、递归算法 * * 解析:http://www.cnblogs.com/cxjchen/p/3932949.html (感谢该文作者!) * * 对于无重复值的情况 * * 固定第一个字符,递归取原创 2021-01-28 22:19:10 · 236 阅读 · 0 评论 -
合并k个已排序的链表——NC.51
题目描述合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。[{1,2,3},{4,5,6,7}]{1,2,3,4,5,6,7}解决方法一:遍历链表数组,两两合并链表。其中合并两个有序链表也是一个算法题,点击此处查看。import java.util.*;/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne原创 2021-01-28 15:44:13 · 260 阅读 · 0 评论 -
根据前序中序重建二叉树——NC.12
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2021-01-26 22:54:01 · 154 阅读 · 0 评论 -
螺旋矩阵——NC.38
题目描述给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。import java.util.*;public class Solution { public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> res = new ArrayList<>(); if (matrix.length == 0) {原创 2021-01-26 22:06:32 · 169 阅读 · 1 评论 -
求平方根——NC.32
题目描述实现函数 int sqrt(int x).计算并返回x的平方根(向下取整)import java.util.*;public class Solution { /** * * @param x int整型 * @return int整型 */ public int sqrt (int x) { // write code here if (x <= 0 ) return 0;原创 2021-01-26 21:39:49 · 161 阅读 · 0 评论 -
两个链表的第一个公共结点——NC.66
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题方法:p1或p2遍历到结尾,就指向pHead2或pHead1,这样可以让两个指针分别在两个链表上同步遍历,解决了链表长度不一致的问题。同时判断节点是否相等的问题。/*public class ListNode { int val; ListNode next = null; ListNode(int val) {原创 2021-01-26 21:01:22 · 481 阅读 · 1 评论 -
大数加法——NC.21
题目描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)这几道题解题思路基本一致:T1. 两个链表生成相加链表注意:最后不要忘记进位标记,java函数传参进位标记并不会更改原方法中的进位标记,要更新。import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即原创 2021-01-26 20:14:49 · 239 阅读 · 0 评论 -
二叉树的之字形层序遍历——NC.14
题目描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)解题思路:在层序遍历二叉树时,根据奇偶层数按序输出结果即可。import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /**原创 2021-01-26 17:58:31 · 260 阅读 · 0 评论 -
最长公共子串——NC.127
题目描述给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。“1AB2345CD”,“12345EF”“2345”解题方法:设置一个二维dp数组,然后两层循环遍历两个字符串。遇到字符相等则:index[i + 1][j + 1] = index[i][j] + 1;同时记录index[i][j]最大时的值以及对应的横坐标或纵坐标。因为最后要根据最大值和横纵坐标取出最长公共子串。最后,注意一下题目中的最长公共子串为空,输出-1下面是一个计算原创 2021-01-25 23:26:06 · 167 阅读 · 0 评论 -
两个链表生成相加链表——NC.40
题目描述假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。起初想把链表转为整数,然后相加后再转为链表,然后我果然错了,这种题考的就是大数相加,这样解决还是大数相加,并没有真正解决问题。解题思路:将两个链表反转,然后逐个节点的相加,注意进位标志。然后检查没算完的链表,注意进原创 2021-01-25 22:09:52 · 380 阅读 · 0 评论 -
子数组的最大累加和问题——NC.19
题目描述给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.题目保证没有全为负数的数据 [要求] 时间复杂度为O(n),空间复杂度为O(1)题解:设一个结果数组res[arr.length]:表示到当前下标元素时,最大累加和。其计算过程为:对于当前元素,如果res[i-1]+arr[i]>=arr[i], 则res[i] = res[i-1]+arr[原创 2021-01-25 20:18:17 · 229 阅读 · 0 评论 -
最近公共祖先——NC.102
题目描述给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。[3,5,1,6,2,0,8,#,#,7,4],5,13解决一递归:在左右子树中寻找是否有o1和o2,判断它们的位置,然后给出结果。import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null;原创 2021-01-21 16:59:49 · 94 阅读 · 0 评论 -
链表中的节点每k个一组翻转——NC.50
题目描述将给出的链表中的节点每k个一组翻转,将给出的链表中的节点每k 个一组翻转,将给出的链表中的节点每k个一组翻转, 返回翻转后的链表如果链表中的节点数不是k的倍数,返回翻转后的链表如果链表中的节点数不是k 的倍数,返回翻转后的链表如果链表中的节点数不是k的倍数, 将最后剩下的节点保持原样将最后剩下的节点保持原样将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。你不能更改节点中的值,只能更改节点本身。你不能更改节点中的值,只能更改节点本身。 要求空间复杂度O(1)要求空间复杂度 O(1原创 2021-01-18 21:59:33 · 576 阅读 · 0 评论 -
括号序列——NC.52
题目描述给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。解决思路:利用栈。遇到左边部分时直接入栈,遇到右边部分时,出栈顶元素判断是否匹配,不匹配直接返回false. 最后考虑几种特殊情况,比如:栈为空时右边部分入栈直接为false.import java.util.*;public class Solution {原创 2021-01-18 21:09:18 · 525 阅读 · 3 评论 -
删除链表的倒数第n个节点——NC.53
题目描述给定一个链表,删除链表的倒数第n个节点并返回链表的头指针例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1->2->3->5.备注: 题目保证n一定是有效的 请给出请给出时间复杂度为\ O(n) O(n)的算法import java.util.*;/* * public class ListNode { * int val; * ListNode next = nul原创 2021-01-17 22:42:53 · 156 阅读 · 0 评论 -
链表中环的入口节点——NC.3
题目描述对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法么?解题分两个步骤:首先,用快慢指针判断是否有环,有的话,返回相遇时节点两个指针分别从head和相遇的节点开始遍历,再次相遇时就是环的入口处节点有一个证明过程:假设在Z处相遇,根据快指针是慢指针的速度两倍,可得出:a+b+n(b+c)=2∗(a+b)a + b + n (b + c) = 2 * (a + b)a+b+n(b+c)=2∗(a+b)即:a=(n−1)∗(b+c)原创 2021-01-17 22:23:31 · 231 阅读 · 0 评论 -
最长无重复子串——NC.41
题目描述给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。import java.util.*;public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here H原创 2021-01-17 17:59:12 · 887 阅读 · 1 评论 -
合并两个有序的数组——NC.22
题目描述给出两个有序的整数数组A 和B ,请将数组A 合并到数组B 中,变成一个有序的数组A注意:可以假设 A数组有足够的空间存放 B数组的元素, A和 B中初始的元素数目分别为m 和 n方法一:和这道题解决思路一致:合并有序链表public class Solution { public void merge(int A[], int m, int B[], int n) { int[] res = new int[m + n]; int i = 0原创 2021-01-16 21:58:48 · 340 阅读 · 0 评论 -
两数之和——NC.61
题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2输入[3,2,4],6输出[2,3]为了一次遍历数组,再遍历每个数据时,都用target去减当前值,得到差值后,将差值和当前原创 2021-01-16 17:26:21 · 121 阅读 · 0 评论 -
用两个栈实现队列——NC.76
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int nod原创 2021-01-16 15:56:35 · 200 阅读 · 0 评论 -
合并有序链表——NC.33
题目描述将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。输入{1},{2}输出{1,2}解法一创建一个新链表import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /** * * @param l1 L原创 2021-01-16 15:26:36 · 228 阅读 · 0 评论 -
跳台阶.NC68
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。输入1返回值1题解动态规划:第n次状态取决与n-1次和n-2次的总和,即a[n] = a[n-1] + a[n-2]; 因为每次只能跳一步或者两步. 这里为了简单我设res[0]=1.public class Solution { public int JumpFloor(int target) { int[] res = new原创 2021-01-15 23:16:12 · 269 阅读 · 0 评论 -
求二叉树的层序遍历.NC15
题目描述给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7},{1,2,3,4,#,#,5}[[1],[2,3],[4,5]]解题方法import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */publ原创 2021-01-15 22:42:13 · 187 阅读 · 1 评论 -
实现二叉树先序,中序和后序遍历——NC.45
题目描述分别按照二叉树先序,中序和后序打印所有的节点。{1,2,3}[[1,2,3],[2,1,3],[2,3,1]]import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param原创 2021-01-12 11:32:35 · 152 阅读 · 0 评论 -
寻找第K大——NC.88
题目描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。[1,3,5,2,2],5,32题解快速排序写出来即可import java.util.*;public class Solution { public int findKth(int[] a, int n, int K) { // write code here Qui原创 2021-01-12 11:15:16 · 345 阅读 · 0 评论 -
二分查找——NC.105
题目描述请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。输入5,4,[1,2,4,4,5]返回值3题解关于二分查找算法的详解,可参考这篇import java.util.*;public class Solution { /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a原创 2021-01-08 18:37:30 · 197 阅读 · 0 评论 -
设计LRU缓存结构——NC93
题目描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值[要求] set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。 若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整数原创 2020-12-30 15:11:22 · 165 阅读 · 0 评论 -
反转链表——NC.78
题目描述输入一个链表,反转链表后,输出新链表的表头。输入{1,2,3}输出返回值{3,2,1}题解:详细见此处/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode原创 2020-12-30 13:19:10 · 384 阅读 · 0 评论