算法
2020越努力越幸运
这个作者很懒,什么都没留下…
展开
-
归并排序
归并排序就是讲一个数组分成两个数组,依次对这两个数组进行排序,再将这两个数组进行整合排序,然后每个数组进行递归操作。代码如下:public class guibing { public static int[] sort(int []a) { if(a.length==1) { return a; } else if (a.length==2) { ...原创 2018-10-05 20:31:48 · 82 阅读 · 0 评论 -
字符串算法之电话号码的字母组合
给定包含数字的字符串2-9,返回改数字可能表示的所有可能的字母组合。例如:输入:“23”输出:思路:这种组合的问题一般都是用dsp深度查找来解决,这里可以将输入的数字转换为字符串数组,然后对这些字符串进行深度查找。字符串数组中每个字符串的每个字符相当于一个节点,第二个字符串的每个节点相当于第一个字符串中的每一个字符的子节点,就这样一次进行遍历。由于最终输出的是字符串数组,因此可以...原创 2019-04-10 19:54:00 · 211 阅读 · 0 评论 -
堆排序
堆排序算法设计,源代码:算法大致思路,每次将数据大顶堆,然后将大顶堆中的根和最后那个数交换,就可以进行一次查最大元素了,接下来再将剩下的数据再次排成大顶堆,依次循环,知道剩下最后一个元素,那么这个元素就是最小的那个崽了,至此排序完成。在生成大顶堆的时候,可以从最后一个元素开始依次将其与父节点进行比较,我的想法是如果这个数是双数的话,那么其父节点(假设存在父节点)只有一个子节点,因此这个时候...原创 2019-03-01 19:38:21 · 96 阅读 · 0 评论 -
字符串算法之乘法字符串
问题描述:给定两个非负整数num1和num2表示的字符串,返回num1乘num2的结果字符串。要求:两者长度都小于110,双方只包含数字0-9,双方没有包含任何前导零,不得使用内置的BigInteger库或直接将输入转换为整数。思路:一个长度为m的数字乘以一个长度为n的数字,其长度最长为m+n。故可以构造一个长度为m+n的数组来表示这两个字符串相乘后的结果。但是得有一个办法来得到每一位的结果,...原创 2019-04-11 19:57:06 · 840 阅读 · 0 评论 -
字符串之字符串组
题目简介:给定一个字符串数组,将其中字符串含有的字符相等的放在一个集合中并返回这些集合的集合。示例:思路:可以使用蛮力法直接求解这些集合。依次遍历字符串集合,每次判断该字符串与现有的集合中是否相符,如果相符则添加至该集合,否则新建一个集合将其添加至该集合中。而每次判断都新建一个方法来进行判断。代码如下:class Solution { public List<L...原创 2019-04-11 22:47:06 · 1616 阅读 · 0 评论 -
DFS算法之验证二进制搜索树
题目简介:给定二叉树,确定他是否是有效的二叉搜索树(BST),假设BST的定义如下:节点的左子树仅包含键小于节点键的节点,节点的右子树仅包含键大于节点键的节点,左右子树也必须是二叉搜索树。示例:思路:我的思路是先进行深度优先遍历该树,将深度遍历的值放入一集合中,这样,只要这个集合中的元素是从小到大的,即满足要求。...原创 2019-04-15 19:51:35 · 325 阅读 · 0 评论 -
DFS算法之无序列表转换为平衡二叉搜索树
题目简介:给定一个单链表,其中的元素不是有序排列的,将其转换为高度平衡的BST(二叉搜索树)。思路:我的思路就是一次遍历单链表,每遍历一个元素,就将其插入树中。在插入的过程中,先找到应该插入的位置,然后在判断树的高度看是否应该进行调整树使其依然保持平衡二叉树的特性,一次进行下去,最终的树就是一个平衡二叉搜索树。源码:/** * Definition for singly-linke...原创 2019-04-15 21:30:12 · 781 阅读 · 0 评论 -
DFS算法之有序序列链表转换为平衡二叉搜索树
题目简介:上一篇做了无序序列链表的元素转换为平衡二叉搜索树,而这次的是有序的,这样来说要相对来说简单蛮多,因为要将有序的进行转换树,每个节点的值直接去数组中的中位数,然后利用分治法进行转换树。这样来说,可以直接将无序的链表转化为有序的,再进行转换为树,这样就会简单蛮多。。。。。。那么上一篇的就做麻烦了。。。。实现思路上面已经说到了,利用分治法可以进行求解。只不过要注意一些细节,中位数如何取,最...原创 2019-04-17 18:54:48 · 230 阅读 · 0 评论 -
DFS之根数和叶数相加
题目:给定0-9仅包含来自数字的二叉树,每个跟到叶路径可以表示数字,一个例子是1->2->3表示数字的root-to-leaf的路径123.求所有根到叶数的总和。叶子是没有子节点的节点。示例:思路:运用递归的方法,每个节点都有一个数值,总和就是依据每一个节点的值相加后得到的。因此进行深度递归,每个节点的数值等于上一个节点的数值乘以10加上该节点的数值,如果有子节点,再进行传...原创 2019-04-17 20:31:25 · 179 阅读 · 0 评论 -
DFS之岛屿数量
题目简介:给定字符1(土地) 和字符0(水)的2d网格图,计算岛屿的数量。岛屿被水包围,通过水平或垂直连接相连相邻的土地而形成。即网格的四个边都被水包围。示例:思路:这个就是将相连的1看做是一个整体,看整个集合中有多少个整体的1。这样一次遍历这个集合,如果某个元素为字符1,则将这个位置的值改为字符0,并且针对这个字符进行四个方向的遍历,如果依然为1则改为0再进行遍历。这样,一个整体的1...原创 2019-04-17 21:28:49 · 615 阅读 · 0 评论 -
DFS之二进制搜索树
题目简介:给定整数n,生成存储值1到n的所有结构上唯一的BST(二叉搜索树)示例:思路:这个很明显需要使用深度查找来进行构建树,可以依次遍历一到n的每一个树,这n个数依次作为树的根节点,然后这些点的左部分就是作为该节点的左树,右半部分就是作为该节点的右子树。依次进行递归,左子树的根节点也可以构成一个集合,右子树一样,这样在依次将左子树和右子树与根节点进行拼接。注意,每一个根节点都是不一...原创 2019-04-29 21:28:05 · 808 阅读 · 0 评论 -
数组之装水的容器
题目简介:示例:思路:我想的是直接用蛮力法进行求解,任意选择两个数字作为容器的两边,求得该容器所得的最大体积,这样可以求得所有的结果,再求解最大值即可。代码:import java.util.*;class Solution { public int maxArea(int[] height) { int max=0; int count=0...原创 2019-05-07 19:29:47 · 728 阅读 · 0 评论 -
数组乘法除自我
算法简介:给定一个n个整数的数组nums,其中n>1,返回一个数组,要求每一个元素是nums数组的其他元素的乘积,如新数组中的第一个元素是所有nums数组中的除去第一个元素的乘积。要求不能使用除法并且时间复杂度为O(n).思路:这里要求时间复杂度需控制在O(n)以内,并且还不能用除法,因此整个计算过程中只能用乘法。计算每个元素的乘积时,需要知道这个元素的左边乘积和右边乘积,因此可以分两边...原创 2019-05-21 18:21:16 · 271 阅读 · 0 评论 -
极大广场
算法介绍:给定一个填充字符0和1的2D矩阵,找到仅包含字符1的最大正方形并返回面积。示例:思路:这个题很明显需要使用动态规划来进行,每一个点的元素都是依赖于前一个斜对角的元素能够组成最大的矩形,如果该点的元素为字符1,则假如上一个斜对角的元素能够组成的最大矩形边长为2,那么就要依次访问该点的横纵两行,如果这两行的前两个元素都为字符1,则该点能够组成的最大矩形的边长就加2为3,如果有一个...原创 2019-05-22 19:40:27 · 166 阅读 · 0 评论 -
动态规划之最长递增子串
题目:给定一个数组,找出其中最长的递增子串的长度。解析:这个很明显就是使用动态规划来进行求解,依次求解每个位置的最长递增子串的长度,然后依次进行比较。代码:class Solution { public int lengthOfLIS(int[] nums) { if(nums.length==0) return 0; ...原创 2019-05-27 19:41:31 · 718 阅读 · 0 评论 -
硬币问题
题目简介:有不同面额的硬币,给定一个总金额,计算构成该数量所需的最少数量的硬币数。如果不能构成这笔钱,则返回-1.示例:解题思路:开始我想的使用贪心法进行求解,但是后面发现贪心法并不能求出最有解,甚至有的时候是无法求出解来的。因此这个题最佳的方法就是使用动态规划的方法来记性求解,动态规划的方式主要是一个位置的结果依赖于上一个位置的结果。一般这样分析,这里有两种数据,一个是硬币的数量,一...原创 2019-05-23 20:45:10 · 1452 阅读 · 0 评论 -
回溯法之排列组合
问题描述:给定一数组,要求给出该数组中元素的所有排列组合。思路:这个题以前笔试的时候就遇到过,要求出数组中的元素的排列组合,这个很明显是使用深度搜索的方式进行查找,主要还是在一些细节的地方设计。我感觉在深度搜索的过程中,需要设计一个集合,存储还未进行位置排列的元素,例如第一个元素已经排列,那么后面的n-1个元素是处于未被排列的状态,然后在排列这n-1个元素。当第一个位置排列第二个元素的时候,那...原创 2019-06-12 18:21:01 · 338 阅读 · 0 评论 -
最长回文子串
问题:给定一个字符串,求解其最长的回文子串。示例:分析:使用动态规划的方法在遍历字符串的同时记录相应点的最大回文串的长度。这里判断回文串的方法为从每个点出发,依次向左向右延伸比较两字符是否相等,一旦某两个节点不相等,即不在往前延伸,这个时候以该节点为中心的回文串的最大长度。但是这里既可以以该节点为中心,也可以以该节点和该节点后面的节点为中心进行延伸。代码如下:class...原创 2019-03-23 14:30:17 · 90 阅读 · 0 评论 -
对角线导线
题目:给定M*N个元素矩阵(M行,N列),以对角线顺序返回矩阵的 所有元素,如图所示。分析:每次比较横竖排元素的位置,当两数相加为奇数的时候和偶数的时候应该做相应的处理,比如元素2(0,1)位置相加为1奇数,这个时候就会面临三种情况,当竖排位置到达数组的最大长度时,横排位置就要加一,即往下移一个元素,当横排的元素位置为0的时候,竖排的元素就要往右移一个,其他情况下,横排的元素减一,竖排的元...原创 2019-03-13 15:13:26 · 128 阅读 · 0 评论 -
最大字段和问题
最大字段和的思想是将字段分为两部分,即将数组平均分为两部分,那么最大字段和的问题分为三种:(1)最大字段和在数组的第一部分(2)最大字段和在数组的第二部分(3)最大字段和在数组的“中间”部分,即以数组的中间数为起点向数组的两端扩展得到的最大子段和这个时候就要用到递归的思想,最开始就分为这三种情况,当求第一种情况时,就又要将“一半”数组分为三种情况讨论,如此递归。针对第三种情况,我采...原创 2018-10-15 18:46:29 · 3910 阅读 · 0 评论 -
KMP算法
public class KMP { public static String a="abacbcabababbcbc"; public static String b="abababb"; public static int[] next(String a) { String m = null; String n=null; char s = 0,t=0; in...原创 2018-10-15 18:48:35 · 84 阅读 · 0 评论 -
动态规划0-1背包问题
动态规划总体的思想与分治法类似,也是将带求解的问题分解成若干个子问题。但是再使用动态规划的时候由于处理子问题比较多,而且这些子问题的数据在后面的操作中会使用到,因此在动态规划使用的时候还需要建立一个“表”。这个“表”就是一个数组,用于记录在处理每一分支的时候的数据。总体的思路还是将带求解的问题分解成若干个子问题 ,最后将这些子问题合并求得要求解的问题。0-1 背包问题,指的是一个重量为W的背...原创 2018-10-15 22:42:29 · 933 阅读 · 0 评论 -
动态规划之最长公共子序列问题
最长公共子序列问题描述的就是给定两个字符串,要求出这两个字符串公共的最长的子序列,例如字符串a="bcadbca",字符串b="cddbbcda",那么这两个序列的最长子序列为"cdbca"。而要利用动态规划的方法来求解这个问题,其大体的思路类似于利用动态规划求解0-1背包问题,一步一步的求解,最终求解出最长子序列。首先将b中的第一个字符与a中的一个、两个、、、、n个进行比较,然后b中的第二个...原创 2018-10-20 20:58:04 · 342 阅读 · 0 评论 -
检查替换后的Word是否有效
原题目是:我们被赋予该字符串“abc”是有效的,从任何有效的字符串V,我们可以将V分成两部分:X和Y(X连接Y)等于V,然后,X+“abc”+Y也是有效的。例如S=“abc”,有效字符串为“aabcbc”,"abcabc",无效的字符串为:“abccba”,"bac","cabcba"。核心算法: public boolean isValid(String S) { ...原创 2019-03-08 18:01:55 · 96 阅读 · 0 评论 -
最大二叉树2
题目:现有一个二叉树,其中每个节点的值都是大于其子树的任何其他值,先要将一个新的数插入到这个树中,要求插入完成后这个二叉树依旧保持该特性,返回该树。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tree...原创 2019-03-08 18:18:05 · 112 阅读 · 0 评论 -
硬币变化问题
题目:你将获得不同面额和总金额的硬币,编写一个函数来计算就构成该数量的组合数,假设拥有无限数量的每种硬币。思想:使用动态规划的方法来求出每种状态的数量,最后求出所有的数量。代码:class Solution { public int change(int amount, int[] coins) { if(coins.length==0) ...原创 2019-03-08 23:44:16 · 193 阅读 · 0 评论 -
最高连续性
问题描述:给定数组A,A是元素为0或者1的数组,我们可以更改K个数组中的0,求数组中最大连续子数组的长度。例子:算法思路:从0开始依次遍历数组,当某个元素为0的时候将其转换为1,由于我们最终只要求解这个最大连续子数组的长度,因此这里 可以用K-1来表示元素从0转换为1。如果为1,则K不变化。接着要用另外一个变量来记录整体最长子数组的起始位置,即当数组在遍历数组元素到底是0还是1的时候,...原创 2019-03-04 09:26:08 · 110 阅读 · 0 评论 -
在每个树行中查找最大值
题目:在一个二叉树中查找每一层中的最大值示例:代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }...原创 2019-03-09 10:32:09 · 211 阅读 · 0 评论 -
找到左下角的树值
题目:给定二叉树,找到树的最后一行中最左边的值示例:代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val =...原创 2019-03-09 10:47:09 · 178 阅读 · 0 评论 -
Teemo工具
题目:在LOL世界中,有一个名为Teemo的英雄,他的攻击可以使他的敌人阿什处于中毒状态。现在,鉴于Teemo攻击Ashe的上升时间序列以及每个Teemo攻击的中毒持续时间,您需要输出Ashe处于中毒状态的总时间。您可以假设Teemo在特定时间点的最开始时进行攻击,并使Ashe立即处于中毒状态。实例:分析:这个就是在每个节点计算其与前一个时间节点的关系,如果时间间隔大于要求...原创 2019-03-14 14:02:52 · 729 阅读 · 0 评论 -
求解最短子集合
题目:输入一个指定长度的数字n,这n个数要求在m范围内,比如输入12个数,这12个数要求都小于等于5,求这12个数中最短的子序列的长度,这个子序列要求包含这5个数。示例:输入:12 52 4 3 1 3 2 5 4 2 1 2 3输出:6代码:import java.util.ArrayList;import java.util.LinkedList;import ...原创 2019-03-10 20:28:39 · 215 阅读 · 0 评论 -
最长的子字符串,不包含重复字符
题目:给定一个字符串,查找最长的字符串的长度,而不重复字符示例:imput :"abcabcabc"Output : 3分析:使用hashset来记录某个位置的元素之前的不重复的最大序列,然后记录其长度与这个元素之前最大子序列的长度,然后再决定是否更改最大序列的长度。代码:class Solution { public int lengthOfLongestSub...原创 2019-03-11 08:43:06 · 452 阅读 · 0 评论 -
算法
题目:给定四个列表A,B,C,D的整数值,计算(i, j, k, l)有多少元组,使其A[i] + B[j] + C[k] + D[l]为零。为了使问题更容易,所有A,B,C,D都具有相同的N长度,其中0≤N≤500。所有整数都在-228到228- 1的范围内,结果保证在大多数231- 1。示例:思路:这是四个元素的数组,首先依次将两个数组的元素互相相加形成两个...原创 2019-03-15 13:54:54 · 109 阅读 · 0 评论 -
按字符的频率对字符串排序
题目:给定一个字符串,根据字符的频率按递减顺序对其进行排序。示例:思路:这个过程其实就是统计字符串中某个字符的个数,然后对这些个数进行排序,依次从大到小的输出指定个数的字符。如果稍微忽略空间的影响,则可以创建s.length个数的list集合,每一个集合分别表示元素的个数,例如标号为1的集合表示该集合里的元素个数都是1,依次类推,所以元素最多也就是s.length个,也就是全部...原创 2019-03-15 14:59:28 · 827 阅读 · 0 评论 -
字符串到数字
题目:该函数首先丢弃所需的任意多个空白字符, 直到找到第一个非空白字符。然后, 从这个字符开始, 取一个可选的初始加号或减号, 然后是尽可能多的数字, 并将它们解释为数值。字符串可以包含构成整数的字符之后的其他字符, 这些字符将被忽略, 并且对此函数的行为没有影响。如果 str 中的第一个非空白字符序列不是有效的整数, 或者如果不存在此类序列, 因为 str 是空的或它只包含空格字符, 则...原创 2019-03-11 17:15:33 · 197 阅读 · 0 评论 -
回溯法之组合总和
题目:示例:思路:这个题一种比较明显的思路就是使用dfs深度优先搜索来进行处理,但是在处理的过程中也有一些小的细节需要注意。首先,这里明确要求了集合中的元素是唯一的,因此,大的集合需要使用set来进行处理,最终将set转换为list即可,用list集合存储每个可以组成target的数字集合。然后就是开始进行深度优先搜索了。从第一个元素开始依次遍历所有元素,每一个元素都可以作...原创 2019-06-08 19:37:21 · 269 阅读 · 0 评论