算法
前路无畏
自律的艰辛总甜过懊悔的苦果!
专注于java后端技术及解决方案,善于总结,分享!
自律的艰辛总甜过懊悔的苦果!
专注于java后端技术及解决方案,善于总结,分享!
自律的艰辛总甜过懊悔的苦果!
专注于java后端技术及解决方案,善于总结,分享!
展开
-
算法025:用两个栈实现队列,支持队列的基本操作(add、poll、peek)
题目:用两个栈实现队列,支持队列的基本操作(add、poll、peek)。add:添加poll:头部弹出(且删除)peek:查看首元素 思路:使用两个栈,分别为 StackPush 和 StackPop1. 数据1,2,3,4,5,线一次压入StackPush,从定到底:5,4,3,2,1,,2. 然后一到手进入StackPop 就实现了queue:1,2,3,4,5,先进先出1.代码如下TwoStacksQueue.java和TwoStacksQueueTest.java:原创 2020-10-26 19:47:31 · 12778 阅读 · 0 评论 -
算法024:计一个有getMin功能的栈-实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
题目:设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。入栈 3、4、5、1、2、1 要求: 1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。 思路:使用两个栈,一个数据,一个放最小值(顶最小)1.代码如下MyStack.java和MyStackTest.java:package com.yuhl.right.leetcode;import java.util原创 2020-10-26 08:38:44 · 13680 阅读 · 2 评论 -
算法023:阶乘尾数0的个数-设计一个算法,算出 n 阶乘有多少个尾随零。
题目: 阶乘尾数 设计一个算法,算出 n 阶乘有多少个尾随零。 示例 1: 输入: 3 输出: 0 解释:3! = 6, 尾数中没有零。 示例2: 输入: 5 输出: 1 解释:5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为O(logn)。 思路:详见代码注释1.代码如下TrailingZeroes.java:package com.yuhl.right.leetcode;/** * @author yuhl * @Date 20原创 2020-10-26 08:38:20 · 12574 阅读 · 2 评论 -
算法022:翻转单词顺序-输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student. “,则输出“stude
题目:翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。示例 1:输入: "the sky is blue"输出:"blue is sky the"示例 2:输入: " hello world! "输出:"world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入原创 2020-10-26 08:37:55 · 14292 阅读 · 1 评论 -
算法021:字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串
题目:字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。 示例1: 输入:"aabcccccaaa" 输出:"a2b1c5a3" 示例2: 输入:"abbccd" 输出:"abbccd" 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。 提示: 字符串长度在[0, 50原创 2020-10-26 08:37:37 · 14895 阅读 · 1 评论 -
算法020:回文排列-判断给定字符串是否为回文排列
题目: 回文排列 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 回文串不一定是字典当中的单词。 示例1: 输入:"tactcoa" 输出:true(排列有"tacocat"、"atcocta",等等) 思路:最多有一个字符只出现一次,其他字符均需要出现两次。否则就饭后false。先排序,比较吗? 使用快排的方式。1.代码如下CanPermutePalindrome .java:package原创 2020-10-26 08:37:12 · 13493 阅读 · 1 评论 -
算法019:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
题目: 字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。 示例1: 输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True 示例2: 输入:s1 = "aa", s2 = "aba" 输出:False 提示: 字符串长度在[0, 100000]范围内。 说明: 你能只调用一次检查子串的方法吗? 思路:旋转的化,考虑s2+s2原创 2020-10-25 08:37:22 · 13119 阅读 · 0 评论 -
算法018:按摩师想挣最多钱-一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优解
题目: 按摩师想挣最多钱 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 示例 1: 输入: [1,2,3,1] 输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。 示例 2: 输入: [2,7,9,3,1] 输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 =原创 2020-10-25 08:09:49 · 14961 阅读 · 0 评论 -
算法017:三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
题目: 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入:n = 3 输出:4 说明: 有四种走法 示例2: 输入:n = 5 输出:13 提示: n范围在[1, 1000000]之间 思路:动态规划:n 阶可以往前退一步,可以时n-1阶所有情况之和+可以时n-2阶所有情况之和+可以时n-3阶所有情况之和1.代码如下 Way原创 2020-10-25 07:57:09 · 16376 阅读 · 1 评论 -
算法016:连续子数组的最大和-输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
题目: 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 提示: 1 <=arr.length <= 10^5 -100 <= arr[i] <= 100思路:使用动态规划 dp[i] 标识以i结尾的数组和最大的值。1原创 2020-10-25 07:51:11 · 14671 阅读 · 0 评论 -
算法015:井字游戏-设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符“ “,“X“和“O“组成,其中字符“ “代表一个空位。
题目: 井字游戏设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" ")中。第一个玩家总是放字符"O",且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符原创 2020-10-25 07:45:22 · 14907 阅读 · 0 评论 -
算法014:判定字符串中字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
题目: 判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s = "leetcode" 输出: false 示例 2: 输入: s = "abc" 输出: true 限制: 0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。 思路:可以使用二进制位记录,这样效率比较高1.代码如下 IsUnique.java:package com.yuhl.right.leetcode;/*原创 2020-10-25 07:36:14 · 13501 阅读 · 0 评论 -
算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在
题目: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target=5,返回t原创 2020-10-25 07:29:31 · 14307 阅读 · 1 评论 -
算法012:数组中的主要元素:数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
题目: 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。 示例 1: 输入:[1,2,5,9,5,9,5,5,5] 输出:5 示例 2: 输入:[3,2] 输出:-1 示例 3: 输入:[2,2,1,1,1,2,2] 输出:2 说明: 你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗? 思路:使用投票算法,主要元素的对立面就是非主要元素,把它们看成一撮就可以了,就是肉搏法。1.代码如下 Majority原创 2020-10-25 07:21:09 · 15078 阅读 · 0 评论 -
算法011: 0~n-1中缺失的数字
题目:剑指 Offer 53 - II. 0~n-1中缺失的数字一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000 思路:使用二分查找,index和velue不一致为需要找到的值1.代码如下 Missi原创 2020-10-25 07:12:59 · 12663 阅读 · 0 评论 -
算法010:数组中的所有元素是先递增后递减(双调数组) 查找给定的值
题目:所谓双调查找 : 就是在一个数组中的所有元素是先递增后递减的,则这个数组被称为双调的。以a数组为例 :{1,2,3,5,8,9,6,4,-1,-9}; 思路:1. 既然是有序的,自然想到的是二分搜索2. 但是与普通的二分搜索不一样,不知道拐点在何处3. 所以大致分为三种情况:① a[mid] 在 左半边但未越过拐点② a[mid] 在右半边越过了拐点③ a[mid]刚好在拐点所以可以分为以上三种情况进行递归查找1.代码如下 Shuangdiao .java:package原创 2020-10-25 00:07:56 · 14448 阅读 · 1 评论 -
算法009:金字塔打印问题,特别注意空格
题目:金字塔打印,三角形 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 思路:注意空格1.代码如下 Pyramid .java:package com.yuhl.right;/** * @author yuhl * @Date 2020/10/24 23:15 *原创 2020-10-24 23:54:30 · 13222 阅读 · 0 评论 -
算法008:LRU算法实现:双向链表+HashMap 实现LRU算法,不允许用LinkedHashMap
题目:LRUTest:Least Recently Used get putpot ,get方法的书写LRU算法实现:双向链表+HashMap 实现LRU算法,不允许用LinkedHashMap思路:热点元素在前,冷元素在后,会被淘汰掉1.代码如下 BinSearch2 .java:1.1LRU.java:package com.yuhl;import java.util.HashMap;/** * @author yuhl * @Date 2020/10/24 22:43原创 2020-10-24 23:10:34 · 13358 阅读 · 0 评论 -
算法007:二分查找 请实现有重复数字的有序数组的二分查找,输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一
题目:二分查找 请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。输入 5,4,[1,2,4,4,5]输出 3(从1开始的哦。不是index)思路:1.代码如下 BinSearch2 .java:package com.yuhl.right;/** * @author yuhl * @Date 2020/10/24 21:59 * @Classname BinSearch * @Description 二原创 2020-10-24 22:42:17 · 19688 阅读 · 0 评论 -
算法006:二分查找 递归、非递归
题目:已知一个有序数组arr 给定需要搜索的元素,返回索引,若无则返回-1思路:递归和非递归![在这里插入图片描述](https://img-1.代码如下 BinSearch .java:package com.yuhl.right;/** * @author yuhl * @Date 2020/10/24 21:59 * @Classname BinSearch * @Description 二分查找,前提是数组为有序的,找到小搜索的元素的下标,如果不存在则返回-1 */pu原创 2020-10-24 22:11:49 · 13610 阅读 · 0 评论 -
算法005:二叉树遍历:深度优先
题目:二叉树,深度优先遍历:结果1 2 4 5 3 6 7 思路:1 先节点 1 进栈,节点1在栈顶2 节节后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈3 节点2在栈顶,然后节点2出栈,访问节点24 节点2的孩子节点5进栈,节点4进栈5 节节节点4在栈顶,节点4出栈,访问节点46 节节点4左右孩子为空,然后节点5在栈顶,节点5出栈,访问节点57 节点5左右孩子为空,然后节点3在站顶,节点3出栈,访问节点38 节点3的孩子节点7进栈,节点6进9 节点6在栈顶,节点6出栈原创 2020-10-24 21:55:44 · 12380 阅读 · 0 评论 -
算法004:二叉树安层遍历、水平打印、广度优先遍历、宽度优先
题目:二叉树,广度优先遍历:结果1234567思路:1 节点1进队,节点1出队,访问节点12 节点1的孩子节点2进队,节点3进队3 节点2出队,访问节点2,节点2的孩子节点4进队,节点5进队4 节点3出队,访问节点3,节点3的孩子节点6进队,节点7进队5 节点4出队,访问节点4,节点4没有孩子节点6 节点5出队,访问节点5,节点5没有孩子节点7 节点6出队,访问节点6,节点6没有孩子节点8 节点7出队,访问节点7,节点7没有孩子节点,结束1.代码如下:1.1Tr原创 2020-10-24 21:47:51 · 12314 阅读 · 0 评论 -
算法003:将单链表的每K个节点之间逆序,例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 ->8 output: 3 -> 2 -> 1 ->6 -.....
题目:将head单链表以m为组反转链表(不足m则不反转):例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 ->8output: 3 -> 2 -> 1 ->6 ->5 ->4 -> 7 ->8思路:可以使用栈的结构解决这个问题,如果栈中值为K则弹出栈使用栈的结构,时间复杂度O(n),控件复杂度为O(K)1.代码如下:1.1Node.javapackage com.原创 2020-10-24 21:14:23 · 13413 阅读 · 0 评论 -
算法002:将单链表的每K个节点之间逆序,例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 ->8 output: 3 -> 2 -> 1 ->6 -.....
题目:将head单链表以m为组反转链表(不足m则不反转):例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 ->8output: 3 -> 2 -> 1 ->6 ->5 ->4 -> 7 ->8思路:可以使用栈的结构解决这个问题,如果栈中值为K则弹出栈使用栈的结构,时间复杂度O(n),控件复杂度为O(K)1.代码如下:1.1Node.javapackage com.原创 2020-10-24 21:02:51 · 13532 阅读 · 0 评论 -
算法001:编写代码,使用3个线程,1个线程打印X,一个线程打印Y,一个线程打印Z,同时执行连续打印10次“XYZ“
题目:编写代码,使用3个线程,1个线程打印X,一个线程打印Y,一个线程打印Z,同时执行连续打印10次"XYZ"思路:需要两个变量:一个记录打印的次数COUNT:0,1,2,3,4,5,6,7,8,9另一个记录该那个线程打印了FLAG: 0-打印X,1-打印Y,2-打印Z1.代码如下:package com.yuhl.right.ali;import java.util.concurrent.TimeUnit;/** * //1、编写代码,使用3个线程,1个线程打印X,一个线程原创 2020-10-24 15:33:39 · 13717 阅读 · 0 评论