刷题
Nicole_sss
这个作者很懒,什么都没留下…
展开
-
常用算法(java)
1. 排序1. 冒泡排序(O(n2))把最大的沉到最后,两两交换public void bubbleSort(int[] nums) {// 外层循环控制排序的轮数 for (int i = nums.length - 1 ; i > 0; i--) { boolean isSorted = true;// ...原创 2020-02-18 18:44:04 · 401 阅读 · 0 评论 -
leetcode | 分类整理(链表)
判断链表相交:直接判断尾节点是否相等160. 链表交点(e)1)长的先走len1-len2步,然后一起,直到相遇2)设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。如果不存在交点,那么 a + b = b + a,以下实现代码中 l1 和 l2 会同时为 null,从而退出循环。pu...原创 2020-02-18 11:19:55 · 145 阅读 · 0 评论 -
leetcode | 分类整理4(动态规划)
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算。重点都是要找到转移方程Fibonacci:在上述方法中,我们使用 dp数组,其中 dp[i]=dp[i-1]+dp[i-2]。可以很容易通过分析得出 dp[i]其实就是第 ii个斐波那契数。 ...原创 2020-02-15 11:49:13 · 393 阅读 · 0 评论 -
leetcode | 分类整理3(搜索)
搜索:BFS:广度优先每一层遍历的节点都与根节点距离相同。设 di表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di<= dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。应该注意的是,使用 BFS 只能求解无权图的最短路径。在程序实现 BFS 时需要考虑以下问题:队列:...原创 2020-02-11 11:14:41 · 217 阅读 · 0 评论 -
leetcode | 分类整理2
二分查找:69. x的平方根(e)重点:1.用x/m<m而不是m*m>x防止溢出;2. 用右中位数防止无限循环744. 寻找比目标字母大的最小字母(e)重点:字母顺序可以循环(a>z),且letters数组是有序的。因此,最后退出循环的时候还要判断:return letters[l] > target ? letters[l] : letter...原创 2020-02-05 13:32:59 · 174 阅读 · 0 评论 -
刷题模板 | map
遍历:1)遍历HashMap的entrySet键值对集合Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); key = (String) entry.getKey();...原创 2020-01-27 10:38:42 · 154 阅读 · 0 评论 -
leetcode | 分类整理1
双指针:167. 两数之和(e)633. 两数平方和(e)345. 反转字符串中的元音字符(e)重点:HashSet的应用,在HashSet中查找的复杂度是O(1)680. 回文字符串(e)重点:因为这道题不是简单判断回文串,由于可以删一个字符(且仅能最多删一个),所以用另一个函数helper,普通的时候就一直l++,r--;第一次遇到不相等,就执行l++或者r--(...原创 2020-01-23 13:32:02 · 214 阅读 · 0 评论 -
剑指offer思路(60-67)
60. 把二叉树打印成多行题:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:1)主要是要知道每一层的个数,然后按个数从队列中取,然后输出打印。2)(难)递归,前序递归保证先左后右的顺序,函数中传递深度,递归每深入一层,就对list数组扩容。代码:1)ArrayList<ArrayList<Integer>> Pr...原创 2020-01-09 11:55:14 · 141 阅读 · 0 评论 -
刷题模板 | 链表相关
1. 链表中有环:快慢指针,一个每次两步,一个一步,最后相遇,就一定有环。public boolean hasCycle(ListNode head) { if (head == null) return false; ListNode slow = head; ListNode fast = head; while (...原创 2020-01-06 17:35:13 · 145 阅读 · 0 评论 -
剑指offer思路 (50-59)
50. 数组中重复的数字题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:1) 位图思想。但是直接用HashMap可能效率略低,由于是0 ~n-1的数字,采用一个n位的b...原创 2020-01-02 22:17:04 · 115 阅读 · 0 评论 -
剑指offer思路 (40-49)
40. 数组中只出现一次的数字题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:1)HashMap2)异或:两个相同数字异或=0,一个数和0异或还是它本身。依次异或,剩下的肯定是那两个只出现一次的数的异或结果。这个结果的二进制中的1,表现的是A和B的不同的位。 我们就取第一个1所在的位数,假设是第3位,接着把原数组分成两组,分组标准是第...原创 2019-12-25 12:12:24 · 126 阅读 · 0 评论 -
剑指offer | 分类整理
未复习:27. 字符串排列29. 最小的k个数35. 数组中的逆序对找规律性质:31. 整数中1出现的次数41. 和为S的整数(滑动时间窗口)43. 左旋转字符串(YX=(XT YT) T)46. 孩子们的游戏47. 1+2+3+...+n(短路求值)48. 不用加减乘除做加法51. 构建乘积数组(矩阵上下三角)52. 正则表达式匹配64....原创 2019-12-09 11:08:08 · 195 阅读 · 0 评论 -
刷题模板 | 动态规划
动态规划的关键:就是可以保存之前的结果并在之后的计算中用到。即把大问题拆成小问题,且这些小问题在之后的运算中可以被重复利用!以下引自:https://blog.csdn.net/zw6161080123/article/details/80639932能用动规解决的问题的特点能采用动态规划求解的问题的一般要具有3个性质:(1) 最优化原理:如果问题的最优解所包...原创 2019-12-09 10:26:15 · 165 阅读 · 0 评论 -
剑指offer思路(31-39)
31. 整数中1出现的次数题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:找规律。链接:https://www.n...原创 2019-12-04 10:42:07 · 233 阅读 · 0 评论 -
刷题模板 | 排序
快速排序(时间O(nlogn),空间O(1)就地排序): public void quickSort(int[] input,int p,int q) { int partition; if (p < q) { partition= partition(input,p,q); quickSort(in...原创 2019-12-03 11:34:56 · 125 阅读 · 0 评论 -
刷题模板 | 看到...就想...(递归、栈)
1. 见到树就想递归2. 见到链表也可以适当的想递归3. 见到栈就想辅助栈4. 见到回溯就想辅助函数helper(即加几个参数的函数用来递归)5. 见到回溯就想递归或者栈(DFS)...原创 2019-11-26 09:56:23 · 106 阅读 · 0 评论 -
刷题模板 | 动态规划
斐波那契式的动态规划:target从0开始适用于f(0) = 0, f(1) = 1public int JumpFloor(int target) { int g = 1,f = 0; while (target --) { g = f + g; f = g - f; } ...原创 2019-11-21 11:41:20 · 196 阅读 · 0 评论 -
刷题模板 | 二分查找
在leetcode上看到有人分享二分的模板,特此总结。作者:liweiwei1419链接:https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/适用条件:有“排序数组”、“有序数列”等,基本都在暗示适用二...原创 2019-11-15 16:50:36 · 227 阅读 · 0 评论 -
剑指offer思路(1-10)
1. 二维数组中的查找题:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。思路:从右上或者左下(eg.左下,则大的话往右找,小的话往上找)代码:private static boolean Find(int target, int[][] array) { if(array == null) return...原创 2019-08-23 10:20:08 · 133 阅读 · 0 评论 -
Leetcode简单题思路(201-300)
202. 快乐数题:编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。输入: 19输出: true解释: 12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 0...原创 2019-09-11 16:53:33 · 88 阅读 · 0 评论 -
剑指offer思路(21-30)
21.栈的压入和弹出序列题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:因为弹栈可能在压入n个数后发生(可能是压压弹弹,也可能是...原创 2019-08-29 11:48:29 · 126 阅读 · 0 评论 -
剑指offer思路(11-20)
11. ※二进制中1的个数题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:把数右移,和1与,来判断1的个数。但是存在问题:当时负数的时候,因为右移会补1,所以会陷入死循环。1. 想到把1左移,直到变为0,左移总是会补0。代码1:public int NumberOf1(int n) { int count = 0; int fla...原创 2019-08-27 15:45:09 · 160 阅读 · 0 评论 -
Leetcode简单题思路(101-200)
101. 对称二叉树思路:1. 递归。如果同时满足下面的条件,两个树互为镜像:它们的两个根结点具有相同的值。 每个树的右子树都与另一个树的左子树镜像对称。public boolean isSymmetric(TreeNode root) { return isMirror(root, root);}public boolean isMirror(TreeNode t...原创 2019-08-27 11:51:56 · 2949 阅读 · 0 评论 -
Leetcode中等题思路
1161. 层序遍历二叉树,找出和最大的队列:queue = new LinkedList重点是记录每层的个数:在入队的时候用nextLen记录本层孩子的个数(即下一层节点个数),然后在遍历完本层之后,curLen = nextLen...原创 2019-08-21 16:05:38 · 119 阅读 · 0 评论 -
Leetcode简单题思路(1-100)
1. 两数之和:不一定有序!!HashMap存储(值,位置)重点是遇到这种情况:[3,3] target=6所以不能直接存完,在hash表中还没有target-nums[i]该元素的时候,直接map.put(nums[i],i);若已经存在,则一定返回要返回{map.get(target-nums[i]),i}7. 反转整数按位取,重点是判断不要越界9...原创 2019-08-21 16:02:26 · 288 阅读 · 0 评论