
算法
IT_BOY__
这个作者很懒,什么都没留下…
展开
-
Leetcode 47. Permutations II
Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.Example 1:Input: nums = [1,1,2]Output:[[1,1,2],[1,2,1],[2,1,1]]大致意思是在全排列的基础上去重,如果先得到所有全排列,再去重,这样的效率是极低的,也是通过不了的。比较好的方法是在全排列的过程中进原创 2021-01-14 13:05:40 · 133 阅读 · 0 评论 -
最长公共子串和最长公共子序列(仅讨论2个字符串)
最长公共子串必须是连续的,而最长公共子序列可以不连续,只要顺序一致就行。例如 s1=abcdef,s2=acdsse,最长公共子串是cd,最长公共子序列是acde,这里简单点,只讨论最大子串或子序列的长度。1、最长公共子串如果按照普通方法求的话,时间复杂度非常高,这里使用动态规划的思想,就是要找出最优子结构,最优子结构之间的联系,构建递推公式,一步步求好小问题,大问题则迎刃可解。最优子结构是,...原创 2020-03-19 16:49:50 · 351 阅读 · 0 评论 -
LeetCode 33. Search in Rotated Sorted Array
Description:Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).You are given a target value to search....原创 2020-02-18 15:11:46 · 184 阅读 · 0 评论 -
LeetCode 31. Next Permutation
Description:Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.If such arrangement is not possible, it must rearrange it as the lowest...原创 2020-02-16 19:23:52 · 173 阅读 · 0 评论 -
leetcode 108. Convert Sorted Array to Binary Search Tree
题意:将一个有序数组转化为一棵平衡二分搜索树算法思路:我们可以将一个有序数组不断往中间切分,中间值就是根结点,其左右子树结点个数相等或相差1,然后它的左半部分和右半部分按照相同的方式切分下去,左半部分挂在左子树上,右部分挂在右子树上,这样需要用一个标记区别左右子树。我在leetcode上提交的结果,挺满意的,分享下:Runtime: 1 ms, faster than 99.17% of Ja...原创 2019-01-21 21:09:12 · 179 阅读 · 0 评论 -
leetcode 78. Subsets II(求集合的子集)
题意:求集合的子集算法思路:先给该集合从小到大排个序。子集分为0个元素(空集)、1、2、…n个元素,找出其对应的组合。为防止找的的子集不重复,有2种方法,第一:子集不在结果中,则加入,花O(n)时间复杂度;第二:在尝试下一个元素时,检查当前元素是否和下一个元素相等,相等则跳过,不相等则继续。参考代码://leetcode 78. Subsets II public static Li...原创 2019-01-26 21:28:12 · 300 阅读 · 0 评论 -
leetcode 40. Combination Sum II(找出和为target的组合)
题意:找出和为target的组合算法思路:首先将数组拍个序,然后进入递归方法,如果target等于当前元素,则加入该组合,为防止组合重复,有2种方式解决,第一,结果中不包含该组合则加入结果;第二,在尝试下一个元素时,检查当前元素是否和下一个元素相等,相等则跳过,不相等则继续。如果target大于当前元素,暂存当前元素,递归进入下一个元素查找,target相应减去当前元素值,查找完成后,除去当前...原创 2019-01-26 22:03:26 · 640 阅读 · 0 评论 -
leetcode 102. Binary Tree Level Order Traversal
算法思路:二叉树的层次遍历,该算法的重点在于找到每一层次的最后一个结点,初始第一层的最后一个结点last为root,然后将根结点放入队列,以队列不为空的条件循环遍历,设置下一层的最后一个结点为preLast,对于出队的结点的左右结点进行入队操作(前提是入队的结点不为空)并且将入队的结点赋值给preLast,当出队的结点是最后一个结点时,则preLast即为下一层的最后一个结点,然后更新last结...原创 2019-01-16 20:49:47 · 197 阅读 · 4 评论 -
leetcode 127. Word Ladder
算法思路:该算法是一个广度搜索问题,查找变换的最优路径(即变换的次数最少)。在java中,因为不能直接构建的一个数据对,所以只能创建一个类Pair2,有2个成员word和step,含义:到达当前单词所经历的单词总个数(也可以说是路径长度)。创建一个以Pair2为类型的队列,将当前数据对封装成Pair2类对象后放入队列。设置一个String类型HashSet记录已访问的单词。在遍历中,先出队,然后...原创 2019-01-16 22:59:33 · 376 阅读 · 0 评论 -
leetcode 343. Integer Break(从递归到动态规划)
题目;Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.Input: 2Output: 1Explanatio...原创 2019-02-02 22:38:15 · 452 阅读 · 0 评论 -
leetcode 279. Perfect Squares
题目:Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.Input: n = 12Output: 3Explanation: 12 = 4 + 4 + 4.算法思路1(BFS和图的最短路径):n从1开...原创 2019-02-05 20:52:28 · 191 阅读 · 0 评论 -
leetcode 62. Unique Paths(动态规划)
题目:A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).The robot can only move either down or right at any point in time. The robot is trying to reach the ...原创 2019-02-06 21:41:21 · 288 阅读 · 0 评论 -
leetcode 198. House Robber
题目:You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent ho...原创 2019-02-08 21:27:36 · 305 阅读 · 0 评论 -
213. House Robber II
题目:You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house ...原创 2019-02-08 21:41:36 · 249 阅读 · 0 评论 -
leetcode 450. Delete Node in a BST
题意:删除二分搜索树中值为key的结点算法思路:当root为null时,直接返回root。首先,用二分搜索法查找到值为key的结点,在查找的过程中记录该结点的父结点并标记该结点是父结点的左孩子还是右孩子(用于保存删除某结点时涉及到的其他结点)。若没有找到key值的结点,则原样返回。若父结点为null,说明删除的结点是根结点,如果 root.left为null,则root指向root.right,...原创 2019-01-21 20:16:12 · 199 阅读 · 0 评论 -
leetcode 401. Binary Watch
题目简述:A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).Given a non-negative integer n which represents the number of LE...原创 2019-01-26 21:05:35 · 257 阅读 · 0 评论 -
4SumII
LeetCode第16题。题意大概是:给定4个长度相等的int数组,从每个数组中任取一个值相加和为0,问共有多少种选择方式?数据大小在0-500.分析:如果暴力求解,用四重循环,时间复杂度O(n4),肯定会超时,不可取。用三层循环,使用一个查找表,时间复杂度为O(n3),很吃力,估计会超时。如果将前2个数组选取的2个值的和与出现的频次以键值对的方式存入Map中,村完后,然后在另外两个数组中两重...原创 2019-01-09 22:00:26 · 155 阅读 · 0 评论 -
leetcode 86. Partition List And leetcode 328. Odd Even Linked List
思路分析:设置一个lessIndex索引,表示连续小于x值的最后一个的索引,初始值为null,想清楚含义至关重要。题目要保证原始的元素的相对顺序不变。遍历到小于x值得元素,将x值的节点放到lessIndex的后面,然后更新lessIndex以保持它的含义。总体思路是这样的,但还有一些细节问题,比如:第一个lessIndex如何处理;当lessIndex与当前节点相邻时,不能按照这两个节点不相邻的...原创 2019-01-11 22:10:38 · 229 阅读 · 0 评论 -
LeetCode 220. Contains Duplicate III
思路分析:首先,我选择HashSet这种数据结构。对数组nums遍历时,判断是否存在2个元素的差的绝对值小于等于t,若是,则返回true,否则,将元素加入set中,并维持更新set集的大小最大为k。set集中的元素一定是连续不相同的,若存在相同元素,进入循环体进行判断时,相同元素值差绝对值为0,一定小于t(t>=0),则满足所有条件返回true。设x为set中的元素,-t <= n...原创 2019-01-12 00:00:25 · 185 阅读 · 0 评论 -
leetcode 347. Top K Frequent Elements(优先队列的使用)
算法思路:首先,将每个数出现的频率以键值对的方式存入HashMap中。创建一个优先队列,队列中的元素是数字和该数字出现的频率组合的信息对,为此,我特地创建了一个信息对的类(C++提供了,java貌似没有提供),不过也挺简单的,当是学习吧。需要重写比较器,使得进队后信息对是按频率从小到大排序(底层是一个最小堆)。然后利用迭代器遍历整个HashMap,当队列长度等于k时,我们需要维护这个优先队列使其...原创 2019-01-18 13:38:48 · 363 阅读 · 0 评论 -
leetcode 445. Add Two Numbers I
算法分析:分别将两个链表存入栈中,然后将两个栈中的元素依次同时弹出,设置一个进位标记carry,两个元素和进位carry相加得到结果value,更新carry值,更新value值保证其小于10,采用头插法插入链表中。当2个栈中的一个为空时,则退出循环。然后继续插入栈不为空的元素节点,直到该栈为空。最后检查进位carry值,若carry不为零,则将carry插入链表中。时间复杂度O(n),空间复杂...原创 2019-01-12 23:12:57 · 161 阅读 · 0 评论 -
leetcode 24. Swap Nodes in Pairs
算法思路:首先对于链表的操作,考虑到头结点的特殊性,我们设置一个虚拟的头结点vmNode,vmNode.next = head,之后的操作就方便多了;题目要求每一对交换节点(不是节点的值),这就涉及到四个节点,考虑到head结点为空或head.next为空,可直接返回head;初始化最开始的四个节点分别为:pre = vmNode,node1 = head , node2 = head.next...原创 2019-01-13 15:27:39 · 147 阅读 · 0 评论 -
leetcode 147. Insertion Sort List
算法分析:这是一个基于链表的插入排序,同样地设置一个虚拟的头结点vmNode,遍历整个链表时,链表中的每个节点与以vmNode为头节点的链表进行比较,找到插入位置,找到后将该节点插入,最终返回vmNode.next。整个算法的时间复杂度为O(n2),空间复杂度为O(1)。参考代码://leetcode 147. Insertion Sort List public ListNod...原创 2019-01-13 16:10:23 · 199 阅读 · 0 评论 -
leetcode 61. Rotate List
Rotate List算法思路:首先,给链表加上一个虚拟头结点,利用双索引找到倒数第k+1个结点q和最后一个结点p,则q是转化后最后一个结点,q.next是转化后的第一个节点。利用穿针引线法将其重新连接成一个链表。最终返回的是q.next结点。考虑特殊情况,可以更好地优化算法,如果取余后k值为0或空链表,可直接返回head。该算法时间复杂度O(n),空间复杂度O(1).。参考代码如下: //...原创 2019-01-13 21:43:14 · 299 阅读 · 2 评论 -
leetcode 143. Reorder List
2019考研408的一道算法题,很伤心,在这里把算法思路理一下,别的不多说,向前看。找出中间结点,然后将后半部分结点逆序,最后将前半部分和后半部分连接起来。第一次统计结点个数n,第二次遍历,遍历到中间结点时,处理奇数个数和偶数个数的情况,若是奇数个数,最中间的节点将是变换结果后的最后一个结点,将其标记下来。注意在遍历时要保持链表不断裂。时间复杂度O(n),空间复杂度O(1)。参考代码://le...原创 2019-01-13 23:36:52 · 161 阅读 · 0 评论 -
二叉树的递归调用
二叉树本身就是递归定义的,所以在二叉树上运用递归非常方便。下面相关算法的思想。leetcode 104. Maximum Depth of Binary Tree题意:找根结点到叶子结点的最长距离(即最大深度)算法思路:当结点为null时,返回0,否则返回左右子树最大距离+1。附上代码: public int maxDepth(TreeNode root) { if...原创 2019-01-18 22:19:22 · 1284 阅读 · 0 评论 -
leetcode 20. Valid Parentheses
算法思路:题目的意思就是求后缀表达式的值,题目保证该后缀表达式是合法的,先设置一个int类型的栈。遍历该表达式,若是数字的字符串,将其转化为int类型后压入栈中,其中有个小问题,处理负数字符串要注意,其判定条件(个人想法)是:str[0]=’-’ && str.length>1;否则,就是操作符,依次弹出2个数据,执行相应操作后压入栈中。遍历结束后,栈中只有一个元素,即返回...原创 2019-01-14 15:18:10 · 224 阅读 · 0 评论 -
leetcode 71. Simplify Path(Unix下简化路径)
算法思路:首先设置一个String类型的栈。用spilt方法,对path进行分割,以“/”为分隔符分割得到一组字符串。接着遍历这组字符串,遇到空字符串(“”)和当前目录(".")跳过,若字符串为"…“且栈不为空时弹栈,若字符串为”…“且栈为空则跳过,其他情况则将元素压栈(if…else if…else…)。最后将栈中的元素和”/"按顺序组合成一条有效路径,当路径为空时,返回根目录,否则返回路径。...原创 2019-01-14 19:59:10 · 351 阅读 · 0 评论 -
leetcode 129. Sum Root to Leaf Numbers
//leetcode 129. Sum Root to Leaf Numbers public static int sumNumbers(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); sumList(root,list,0); i...原创 2019-01-20 22:38:55 · 251 阅读 · 0 评论 -
leetcode 113. Path Sum II
题意:求和为sum的路径,将满足的所有路径返回算法思路:首先创建一个list(用来存储所有路径),当root为null时,返回list。当该结点为叶节点并且其值为sum,则将该结点作为一条路径加入list中,返回list。从它的左孩子获取满足条件的路径,然后遍历获得的路径,将本结点加入到该路径后将该路径加入到list中。相应地从它的右孩子获得满足条件的路径,操作和前面类似,不足赘述。最后返回li...原创 2019-01-20 23:01:47 · 173 阅读 · 0 评论 -
九宫格
九宫格将数字 1 ,2,3… 9 填入一个 3×3 的九宫格中,使得格子中每一横行和的值全部相等,每一竖列和的值全部相等。请你计算有多少种填数字的方案.思路:使用递归调用,每一个空格填入一个与前面不相同的数字,数字是1-9,用一个循环遍历,递归出口,就是填了9个数字,然后判断是否符合,是count++,返回,不是也返回。附上代码:#include<iostre...原创 2018-03-28 17:42:41 · 783 阅读 · 0 评论