牛客网算法题
努力不停努力
我要成为自己眼中最耀眼的一束光
展开
-
旋转数组的最小数字 (二分法)
旋转数组的最小数字NC71直接上代码和注释 /** * 二分法 * 如果二分之后能够明确目标值在二分的哪一侧, * 即可使用二分法 * * 二分得到一个mid,arr[mid]要和一个compVal比较以判断 * 目标值的位置, * 若 compVal为arr[right], * 1. arr[mid] > compVal, 最小值一定是在mid的右侧,原创 2021-06-08 11:06:36 · 149 阅读 · 0 评论 -
牛客NC125 未排序数组中累加和为给定值的最长子数组长度(动态规划、哈希法)
牛客NC125直接上代码和注释目录动态规划哈希法类似的题目动态规划时间复杂度O(n ^ 2),空间复杂度O(1) /** * 动态规划 * 状态dp[i][j],子数组[i-j]的和 * * 可以进行空间压缩 * max length of the subarray sum = k * @param arr int整型一维数组 the array * @param k int整型 target *原创 2021-06-07 17:08:52 · 281 阅读 · 0 评论 -
矩阵最长递增路径 (记忆化的递归搜索,动态规划)
牛客NC138 矩阵最长递增路径leetcode329 矩阵中的最长递增路径记忆化的深度优先遍历每个点的最长递增路径是确定,因此我们可以记录每个点的最长递增路径的长度,下一次访问到该点时就直接返回路径长度即可。会不会出现路径重复的情况(如下图的情况)呢?很明显是不会的,因为路径是递增的,这种情况会破坏路径的递增关系。 private int[][] dirs = new int[][]{{1, 0}, {0, -1}, {-1, 0}, {0, 1}}; private in原创 2021-06-02 13:40:47 · 270 阅读 · 0 评论 -
股票交易的最大收益(二)(两次交易,动态规划)
牛客NC135股票交易的最大收益(二)import java.util.*;public class Solution { /** * 动态规划, * dp[i][0],直到第i天第一次买入的最大收益 * dp[i][1],直到第i天第一次卖出的最大收益 * dp[i][2],直到第i天第二次买入的最大收益 * dp[i][3],直到第i天第二次卖出的最大收益 * 买入就减收益,卖出原创 2021-06-02 11:11:41 · 947 阅读 · 0 评论 -
牛客NC126 换钱的最小货币数(动态规划)
原题链接 动态规划递归 时间复杂度过高动态规划时间复杂度为O(n * aim), 空间复杂度为O(aim),n是arr数组的长度 /** * 最少货币数 * 动态规划: * 状态: dp[i],凑成i元需要的货币数 * * @param arr int整型一维数组 the array * @param aim int整型 the target * @return int整型 */原创 2021-05-18 12:40:55 · 250 阅读 · 0 评论 -
经典算法题:约瑟夫环
约瑟夫环问题问题定义解法1. 模拟链表2. 数学方法(时间复杂度较低)例题问题定义0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。解法1. 模拟链表该方法时间复杂度为O(n * m)/** * @author 49367 * @date 20原创 2021-05-14 15:27:52 · 389 阅读 · 0 评论 -
牛客NC6 二叉树的最大路径和(二叉树的遍历,递归,动态规划)
原题链接/** * @author 49367 * @date 2021/4/28 10:54 */public class MaxPathSumNC6 { private int maxSum = Integer.MIN_VALUE; /** * 获取树的最大路径,开始结点和结束结点都可以是任意结点 * @param root TreeNode类 * @return int整型 */ public int maxPathSum (原创 2021-04-28 13:45:24 · 222 阅读 · 0 评论 -
牛客NC30 数组中未出现的最小正整数
原题链接解题思路:使用堆排序,构造小顶堆。时间复杂度O(nlogn),空间复杂度O(1)使用HashMap,时间复杂度O(n),空间复杂度O(n)原地哈希,时间复杂度O(n), 空间复杂度O(1)具体实现: /** * 原地哈希算法 (哈希算法的改良版) * 给定一个数组arr,数组长度为len,未出现的最小正整数一定不会超过len + 1, * 即 [1, len] 这个区间的数都出现了,那么未出现的最小正整数就是len + 1,原创 2021-04-25 12:25:02 · 326 阅读 · 0 评论 -
牛客 NC60 判断该二叉树是否为搜索二叉树和完全二叉树 (二叉树,层序遍历,中序遍历)
原题链接判断搜索二叉树可以用中序遍历或者递归判断搜索二叉树的方法用递归 /** * * @param root TreeNode类 the root * @return bool布尔型一维数组 */ public boolean[] judgeIt (TreeNode root) { // write code here boolean[] res = new boolean[]{false, false};原创 2021-04-19 18:33:56 · 134 阅读 · 0 评论 -
牛客NC92 输出两个字符串的最长公共子序列(动态规划)
原题链接public class Solution{ /** * 动态规划 * 状态:dp[i][j] 表示s1前i个字符和s2前j个字符的最长公共子序列的长度 * * 状态转移方程: * 若s1[i] = s2[j], dp[i + 1][j + 1] = dp[i][j] + 1 * 为什么不考虑dp[i + 1][j]或dp[i][j + 1]? *原创 2021-04-18 14:20:26 · 577 阅读 · 0 评论 -
牛客NC35 最小编辑代价 (动态规划,压缩空间的动态规划)
原题链接理解动态规划后,压缩空间是一大难点,需要找出遍历过程中需要用到的状态和不需要用到的状态,去掉不需要用到的状态,存储需要用到的状态。import java.util.*;public class Solution { /** * 动态规划 * 状态:dp[i + 1][j + 1],str1[0-i]编辑成str2[0-j]的最小cost * * min edit cost * @param str1 string字符串 t原创 2021-04-14 23:01:30 · 252 阅读 · 0 评论 -
牛客NC59 矩阵的最小路径和 (动态规划,压缩空间的动态规划)
原题链接解题方法暴力递归(时间复杂度过高)动态规划压缩空间的动态规划(可以降低空间复杂度)暴力递归(时间复杂度过高)每个位置都尝试向右走和向左走,时间复杂度较高,为 O(2 ^ (n * m))public class Solution{ private int minPathSum; /** * @param matrix int整型二维数组 the matrix * @return int整型 */ public int minPathSu原创 2021-04-12 22:20:35 · 142 阅读 · 0 评论 -
牛客NC73 数组中出现次数超过一半的数字 (候选法、摩尔投票算法)
牛客网原题链接leetcode剑指Offer39如何理解摩尔投票算法核心思路:对拼消耗玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你,或者其他国家也会相互攻击),但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自己人。 /** * 找出数组中出现次数超过数组长度len的一半的数,若没有则返回0 * 最佳解法: * 候选法原创 2021-04-12 20:30:22 · 197 阅读 · 0 评论 -
牛客NC62 判断是不是平衡二叉树 (二叉平衡树)
原题链接这虽然是一道简单题,但是要找到最佳的解法还是比较困难的解题方法最直接的思路使用Map结构存储高度信息后序遍历自底向上同时返回高度信息我的解法 (自定义高度类存储高度信息)他人的解法(不需要自定义类)最直接的思路这道题,最直接的思路就是从上到下,判断每一个结点的左子树和右子树的高度差是否小于或等于1,所有结点都满足平衡二叉树的条件才能返回true。也可以根据后序遍历,从下往上判断。但是,这个解法有个问题,就是我们在求位于上方的结点的最大高度的时候,其实已经把下方的结点的最大高度也给求出来了,原创 2021-04-12 17:15:52 · 262 阅读 · 0 评论 -
牛客NC136 根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图(二叉树,深度遍历)
原题链接绝大部分题解都是先重建二叉树,然后再对二叉树进行层序遍历输出它的右视图。其实,我们可以在重建二叉树的过程中,同时得到它的右视图。核心思路:二叉树的右视图是它由上到下每一层最靠右的结点的集合。代码如下:/** * @author 49367 * @date 2021/4/11 16:17 */public class Solution{ private HashMap<Integer, Integer> inRootMap; private List<原创 2021-04-11 16:56:55 · 349 阅读 · 0 评论 -
牛客NC90 设计一个能够返回最小值的栈(栈)
原题链接/** * @author 49367 * @date 2021/4/8 20:58 */public class GetMinStackNC90 { /* 利用栈先进后出的特性。 */ private Deque<Integer> dataStack = new LinkedList<>(); private Deque<Integer> minStack = new LinkedList<>();原创 2021-04-08 23:04:34 · 86 阅读 · 0 评论 -
牛客NC32 求平方根(二分法,牛顿迭代法)
原题链接 二分法牛顿迭代法 [参考链接1](https://blog.csdn.net/u010947534/article/details/87874019) [参考链接2](https://blog.csdn.net/weixin_42109012/article/details/91359268)二分法任何有边界的有序数字的集合的查找操作都可以使用二分法。这道题一开始我们很容易想到从num = 1开始求,num 加 1 直到 x / num = num为止。由于我们是按升序取数字的,且当 x &原创 2021-04-08 20:56:42 · 248 阅读 · 0 评论 -
牛客NC48 在转动过的有序数组中寻找目标值(二分查找)
原题链接不知道未经过转动的原数组是升序排列还是降序排列的情况下,我们可以先按升序二分查找,再按降序二分查找。 /** * 二分查找 * 当前数组肯定是有两部分是有序的,所以取mid时, * 要么 [l, mid] 是有序的,要么 [mid + 1, r]是有序的 * * @param A int整型一维数组 * @param target int整型 * @return int整型 */ p原创 2021-04-07 17:22:15 · 130 阅读 · 0 评论 -
牛客NC91 最长递增子序列(动态规划、贪心+二分查找)
原题链接 动态规划(时间复杂度 O(n^2))贪心 + 二分查找 (时间复杂度 O(nlogn))动态规划(时间复杂度 O(n^2)) /** * return the longest increasing subsequence * @param arr int整型一维数组 the array * @return int整型一维数组 */ /** * 动态规划 * 状态 dp[i][2], dp[i][0]是以 a原创 2021-04-06 20:40:28 · 663 阅读 · 0 评论 -
牛客NC17 最长回文子串(动态规划)
原题链接 中心扩散法动态规划中心扩散法 /** * 中心扩散法 * * @param A * @param n * @return */ public int getLongestPalindrome(String A, int n) { // write code here char[] chars = A.toCharArray(); if (chars.length ==原创 2021-04-05 15:42:27 · 257 阅读 · 0 评论