算法题
LeetCode、牛客网等相关算法解题
我の唯一
家乡河南,毕业于郑州大学。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 Offer 11. 旋转数组的最小数字(简单)
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。示例:思路:原创 2022-05-09 01:01:57 · 312 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点(简单)Java
题目描述:给定一棵二叉搜索树,请找出其中第 k 大的节点的值。示例:思路:创建一个 List , 将所有节点放到 List 中,取出 List 长度 减去 k 的值代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x;原创 2022-05-19 23:39:58 · 159 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子(简单)Java
题目描述从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例思路先定义最大值和最小值如果有相同的,直接返回 false遇到 0 直接跳过,不参与最大值最小值最后如果 max - min <= 4,则代表为顺子小于 4 的是因为可能有王的存在代码class Solution { public boolean isStraight(原创 2022-05-20 23:42:03 · 273 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列(简单)
题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )例:思路:题目整体相对较为简单,主要是对于队列的了解。队列是先进先出的,所以在此算法中,需要用到两个链表。代码:class CQueue { LinkedList<Integer> list1,list2; public CQueue()原创 2022-05-05 23:39:04 · 186 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(简单)Java
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:方法1:思路:如果是空数组,直接返回.如果数组不为空,遍历数组,如果是奇数,在这个位置之前的数组向前提,把该位置的值放在数组为 0时间复杂度为O(n*n)代码:class Solution { public int[] exchange(int[] nums) { if(nums.length == 0){ ret原创 2022-05-17 00:54:44 · 169 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找(中等)
题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:思路:题目看起来是相对简单,给的实例也只有129个,怎么写都是0ms。但是还是有一些优化的方法的,在这里的时间复杂度为 O(m*n) 。可以选择如果一旦小于 [ i ][ j ] ,则 i+1行只用比前 j 列就可以。代码:class Solution { public boole原创 2022-05-09 00:47:51 · 74 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和(简单)Java
题目描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例:思路:利用动态规划的思路解决问题,首先定义最大值为 nums[0] 和最大和 sum 。再试用循环,判断最大的值。在这个算法中,时间复杂度为 O(n).代码如下:class Solution { public int maxSubArray(int[] nums) { int max = nums[0];//定义最小值 int原创 2022-05-13 13:43:30 · 234 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树(中等)
题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。示例:思路:运用递归的方法进行实现代码:class Solution { public int[] levelOrder(TreeNode root) { if (root == null) { return new int[0]; } List<Integer> list = new ArrayList<&原创 2022-05-10 03:05:58 · 133 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串(中等)Java
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度示例:思路:之前做过相关的题,思路是建立hashmap,k值储存charAt(i)的值,value 储存位置。代码:class Solution { public int lengthOfLongestSubstring(String s) { if (s.length()==0){ return 0; } int max=0;原创 2022-05-14 19:53:24 · 113 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围--慢慢改进解(中等)Java
题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例:思路:思路一:创建一个新的数组,通过递归的方式从0,0 开始向下、向右递归,符原创 2022-05-18 12:52:22 · 129 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点(简单)Java
题目描述输入两个链表,找出它们的第一个公共节点。示例代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution {原创 2022-05-16 01:26:43 · 103 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列(简单)
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例:分析:采用循环解决问题,需要注意的是结果为b取模100000000原创 2022-05-12 15:30:34 · 167 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数(中等)Java
题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例思路如果数组的长度为1,直接返回数组中的值变为 String 就可以了先把 int 数组转变为 String 类型数组,利用冒泡排序法进行排序,最后输出用到的思路是比较两个字符串的大小String aString b如果 a + b > b = a,交换位置代码class Solution { public String minNumber(int[] nums)原创 2022-05-20 23:38:07 · 134 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串(简单)
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例思路:之前在力扣上做过类似的,现在来看 还是比较简单的,思路是将两个s相加,直接返回 n->n+s.length()+n 的字符串即可。这次做一下优化,用 StingBuilder 尝试一下代码:class Solution { public String rever原创 2022-05-07 21:19:02 · 129 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像(简单)
题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。示例:思路:直接用递归的方法进行实现,简单方便还快捷。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solutio原创 2022-05-11 01:16:38 · 85 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串(中等)Java
题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例:思路:用动态规划的方法,如果后两个数字的和大于10,小于26,则为m+n,否则,和i-1的翻译方法种类数相同代码:class Solution { public int translateNum(int num) { if(num原创 2022-05-14 19:44:07 · 893 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I(简单)
题目描述:统计一个数字在排序数组中出现的次数。示例:思路:通过分析可以知道,是一个非递减的数组,可以更快的找到数组中的位置,题目本身并不难,难的是优化算法。首先想到的是二差寻找,找出 target-1的位置,然后去找相等的数值的个数。但是在写的过程中,二分法用这个比较难实现,最后选择进10法。代码:class Solution { public int search(int[] nums, int target) { if(nums.length==0||target原创 2022-05-08 01:36:48 · 285 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字(简单)
题目描述:示例:思路:代码:class Solution { public int findRepeatNumber(int[] nums) { HashSet<Integer> integers = new HashSet<>(); for(int i=0;i<nums.length;i++){ if (integers.contains(nums[i])){ retur原创 2022-05-08 00:50:48 · 596 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制(中等)
题目描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。实例:思路:通过创建HashMap,将 head 与新创建的Node相对应即可。代码:/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(in原创 2022-05-06 23:26:56 · 61 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题(简单)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例:分析:用类推法解决问题:当 n = 0,输出 1;当 n = 1,输出 1;当 n = 2,输出 2,即 n(0)+n(1);当 n = 3,输出 3,即 n(1)+n(2);当 n = 4,输出 5,即 n(2)+n(3);以此类推:n(n) = n(n-1)+n(n原创 2022-05-12 15:51:35 · 140 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径(中等)Java
题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:思路:思路一:定义一个递归方法,在主方法中创建数组,用来固定走过的路径。走两个循环,遍历一遍。思路二:也是运用递归的方法,只不过在递归方法上有返回值代码:思路一代码:class原创 2022-05-18 15:32:03 · 186 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序(简单)Java
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例:思路:定义两个字符串,第一个用来储存返回对象,第一个动态存储单词。遍历字符串。时间复杂度为O(n)代码:class Solution { public String reverseWords(String s) { if(s.length()==0){原创 2022-05-17 01:46:50 · 194 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表(简单)Java
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例思路首先出那个键一个新的链表,取两个链表的最小值,然后通过两个链表中的值作比较,依次代入。时间复杂度为O(M+N)代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * }原创 2022-05-16 01:01:12 · 221 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构(中等)
题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。示例:思路:需要进行两次递归,在方法中判断两个树Tree是否为A的子树是运用递归,在主方法中也需要调用递归进行迭代。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2022-05-11 23:32:06 · 1062 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(简单)Java
题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例:思路:先定义ListNode复制head。然后对head进行遍历,如果val等于题目中的val,直接跳过。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val =原创 2022-05-15 17:06:22 · 179 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字(简单)Java
题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例:思路:利用双指针,通过循环来进行比对。如果是任意一个数大于target,直接下一个循环代码:class Solution { public int[] twoSum(int[] nums, int target) { int[] arr = new int[2]; for(int i = 0;nums[i]<t原创 2022-05-17 01:17:10 · 135 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径(中等)Java
题目描述:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。原创 2022-05-19 23:55:57 · 106 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III(中等)
题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。示例:分析:在上一题的基础上,需要将奇数行的链表进行反转,可以直接使用 Collections 中的 reverse 的方法进行反转。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNod原创 2022-05-10 19:43:09 · 176 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值(中等)Java
题目描述:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例:思路:动态规划解决,通过计算每一步的最大值,然后返回最后一步就可以了。时间复杂度为O(m*n);代码:class Solution { public int maxValue(int[][] grid) { //定原创 2022-05-13 13:49:05 · 86 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字(简单)
被这道题搞得无语了原创 2022-05-08 02:00:37 · 187 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润(中等)Java
题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例:思路:之前做过这道题,两种思路(贪心算法,和动态规划),本次使用的是动态规划算法,代码如下:代码:class Solution { public int maxProfit(int[] prices) { int min = Integer.MAX_VALUE; int cha = 0; for(int i = 0;i<pri原创 2022-05-12 17:54:47 · 146 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表(中等)Java
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。示例思路:在代码中可以看到代码/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val原创 2022-05-19 23:47:40 · 118 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树(简单)
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。示例:思路:之前在力扣上刷到过这个算法,也是用递归的方法进行实现的。代码如下:代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) {原创 2022-05-11 11:00:45 · 54 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II(简单)
题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。示例:思路:题目考察的是数的按层遍历。可以创建一个数组的链表。构造一个方法,将树按照不同的层级放到链表中代码:class Solution { List<List<Integer>> list = new ArrayList<>(); public List<List<Integer>> levelOrder(Tre原创 2022-05-10 19:07:18 · 170 阅读 · 0 评论 -
剑指 Offer 05. 替换空格(简单)
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。实例分析第一反应就是新建一个字符串。通过循环读取 s.charAt 的值。代码比较简单,直接上代码~代码class Solution { public String replaceSpace(String s) { String a=""; for(int i=0;i<s.length();i++){ if(s.charAt(i)==' '){原创 2022-05-07 19:24:57 · 60 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(简单)
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。例:思路:首先想到的是用int来进行计算的,但是没有想到head.val可能是大于9的,所以失败了,代码奉上吧/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class原创 2022-05-06 22:28:54 · 253 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈(简单)
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。例:分析:是找出在栈的最小值,本来想用数组来着,但是要求空间复杂度为O(1),就放弃使用了。用两个栈来进行,第二个栈用来储存最小值的顺序代码:class MinStack { /** initialize your data structure here. */ Stack<Integer> stack1,s原创 2022-05-06 00:15:35 · 292 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(简单)
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。实例:思路:直接改变指针的只想即可。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNod原创 2022-05-06 22:57:30 · 282 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点(简单)Java
题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:思路:先遍历链表的长度。在返回长度-k的节点即可。时间负责度 O(n)代码:/** * Definition for singly-linked list. * public class ListNode { * in原创 2022-05-15 17:14:36 · 146 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度(简单)
题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。示例思路用递归的方法代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } *原创 2022-05-27 23:45:06 · 99 阅读 · 0 评论
分享