![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题
文章平均质量分 52
qq_23204557
这个作者很懒,什么都没留下…
展开
-
求最小词典序的数
因为越高位对整体大小影响越大,适用贪婪算法,从左到右尽最大可能让各位数字呈递增趋势;描述,还有321、1081两道题也属于这种类型。原创 2023-07-24 03:50:26 · 56 阅读 · 0 评论 -
心海舟楫、三一重工面试(部分)
一道算法题:我开始给出的是暴力解法,时间复杂度O(n^2)。在面试官的提示下,实现了时间复杂度为O(n)的解法。原创 2023-07-23 01:59:55 · 301 阅读 · 0 评论 -
左右指针向中间相遇
缩减时你需要证明被缩减掉的空间是不会有解的。比如此时是1号短板和7号短板,7号较短。,6号中谁与7号配对,高度一定小于等于7号,同时宽容缩小,所以面积一定小于现在的1、7配对。如果移动短板到更短板,则此状态的面积不是也必然减小吗?初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;,底层完全是相同的。因为每次移动短板,则最短板可能变大,下一个面积可能增大。而如果移动长板,则短板不变或者变小,下一个面积必然变小。这一列的搜索空间,对应于双指针解法的代码,就是。原创 2023-07-18 22:50:34 · 114 阅读 · 0 评论 -
时间复杂度为O(nlogn)的求最长递增子序列的解法
最长递增子序列原创 2023-06-18 17:25:09 · 54 阅读 · 0 评论 -
Leetcode188. Best Time to Buy and Sell Stock IV官方解法
股票买卖核心思想是用两个数组buys, sells来记录状态,使用动态规划来解。转载 2023-02-22 06:47:24 · 97 阅读 · 0 评论 -
待刷和研究的题目
排列组合相关题目:java 1ms simple solution which combines permutation and subset原创 2023-02-09 23:44:31 · 65 阅读 · 0 评论 -
LeetCode 57. Insert Interval和 218. The Skyline Problem
https://leetcode.com/problems/insert-interval/学习了力扣中国官方给出的思路和一玩家提出的分成 3 个阶段考察的思路。有:如果两个线段之间没有交集,其充要条件为r1<l2。本题可转化为求线段之间的并集。ac代码...原创 2021-04-28 11:18:33 · 90 阅读 · 0 评论 -
数据容器的相互转化
不能使用Arrays.asList方法。除了直接遍历外,就是:int[] nums = {1,2};List numCandidates = Arrays.stream(nums).boxed().collect(Collectors.toList());原创 2021-04-24 10:20:07 · 122 阅读 · 0 评论 -
供笔试参考的一些典型问题或可复用代码或注意事项
LeetCode 46. Permutations return all the possible permutations.求最大公约数gcd:int gcd(int a,int b){ if(a==0) return b; return gcd(b%a,a);}原创 2021-04-27 03:56:16 · 290 阅读 · 0 评论 -
判断有向图是否有环
题目:LeetCode207. Course Schedule。本质就是遍历时每个点的状态会在这三种状态中变化:未访问(未发现)、已发现(刚开始对其dfs时)、已结束(即将退出其dfs时)。有环等价于有回边(backEdge),而回边的特点是指向已发现而还未结束的点。原创 2021-04-27 01:31:54 · 529 阅读 · 0 评论 -
当结点数较少时,用int的每bit表示一个结点的状态
来源于LeetCode996. Number of Squareful Arrays。我自己给出的第一种解法我自己给出的第二种解法借鉴了官方Solution中的第二种解法,只是尚未把每个结点的状态位压缩到bit。而是构造了一个成员变量为int, ArrayList<Boolean>的类保存中间结果。我自己给出的第三种解法则基本重现了官方Solution中的第二种解法。其精华在于其结点数较少,可以用一个int数的每位(还没用完)表示一个结点的状态,这样上面的ArrayList<Bool原创 2021-04-25 01:37:34 · 96 阅读 · 0 评论 -
LeetCode1691. Maximum Height by Stacking Cuboids的两种解法
首先必须注意到一点,两个立方体cub1和cub2, cub2可以放在cub1上的充要条件是min1<=min2且mid1<=mid2且max1<=max2。所以要首先对所有立方体中的3条边做个排序。另外一点很重要的是,此题中的cub之间可理解为一种偏序关系在此基础上我发现了两种高效解法,其时间复杂度都为O(n^2)解法1:后半部分用到了dp,思路类似于求最长递增序列。class Solution { public int maxHeight(int[][] cuboids原创 2021-04-22 00:35:30 · 194 阅读 · 0 评论 -
用费马小定理+快速幂解决“除法取模“问题
费马小定理:若p是质数,且c、p互质,那么c^(p-1) mod p = 1。此时求a/c mod p,通过一系列转化,可消除除法:a / c mod p= a / c mod p * 1= [a / c mod p * c^(p-1) mod p ] mod p= a * c^(p-2) mod p在实际解题中,p经常是1000000007,所以又经常要用到快速幂。如:(sum!a!∗b!∗c!)%1000000007=(sum!∗(a!∗b!∗c!)1000000005)%10000000原创 2021-04-19 04:27:02 · 372 阅读 · 0 评论 -
why does dp not work?
在leetcode上刷到一题,很有趣,值得一记:1091. Shortest Path in Binary Matrix。简单来说就是求一个矩阵从左上角到右下边的最短距离:此题和leetcode上的另外一题(题号忘了,以下简称为题1)极为相似。问题都一样,只是路径成立的条件有区别:本题可以从一点周围的所有8个点连过来,而题1只可以从一点的左上、上方、左方三个方向的点连过来。题1可以很快用dp解出,所以我的本能反应也是用dp来解此题。然而编完程后发现程序报StackOverFlowError, 陷入了无限递原创 2020-11-22 02:54:46 · 105 阅读 · 0 评论 -
用一个平均分布的随机函数,构造另外一个平均分布的随机函数
如Random7 Using Random5:Given a random generator random5(), the return value of random5() is 0 - 4 with equal probability. Use random5() to implement random7().class Solution(object): def random7...原创 2019-11-06 19:11:30 · 368 阅读 · 0 评论 -
利用分数
max-points-on-a-line 此题需要用到斜率做Map的键,但是斜率不是整型,即使用double都会存在误差,怎么办?可用分子/最大公约数,分母/最大公约数。这样我们可以用两个整型数来精确表达一个有理数。此法的另一好处是它甚至可以表示无穷大(分子不为0,分母为0)。ac代码: public int maxPoints(int[][] points) { if(po...原创 2019-08-21 01:52:25 · 84 阅读 · 0 评论 -
用并查集解 kick start的Wiggle Walk
kick start c轮第一题Wiggle Walk,受此处的启发,发现用可4个并查集来解,注意两点:1,我是用map而非数组来实现并查集的,因为担心上次内存溢出的问题重现;2,普通并查集不强调根的位置,此处不相同,根的位置代表了此段的极限,合并时应注意。ac的代码在Attempt 36 Jul 28 2019, 01:09 private Point findRoot(Map<P...原创 2019-07-28 01:43:31 · 217 阅读 · 0 评论 -
maximum number of repeated square root operations
http://www.hellojava.com/a/68845.html public int solution(int A, int B) { int nop = 0; A = (int)Math.ceil(Math.sqrt(A)); B = (int)Math.floor(Math.sqrt(B)); while(B ...原创 2019-06-30 23:23:22 · 184 阅读 · 0 评论 -
如何对map的entry进行排序
参考https://leetcode.com/problems/sort-characters-by-frequency/import java.util.Comparator;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java...原创 2019-07-07 00:31:09 · 1498 阅读 · 0 评论 -
基数排序
https://leetcode.com/problems/maximum-gap/用java实现了一下,采用LSD(最低位优先法):(未考虑有负数的情况) private static void radixSort(int[] nums) { int max = nums[0]; for (int i = 1; i < nums.length; ...原创 2019-07-07 02:48:02 · 89 阅读 · 0 评论 -
最小\大栈以及最小\大队列 单调队列
此题也可用单调队列来解:https://leetcode.com/submissions/detail/248883712/ 理由是最终队列中包括的所有元素,都是从它的左边元素(exlusive)到它这一段中,用时最长的 (官方提供的默认解法时间复杂度与我相同)。当然此处的单调队列与上面的略有不同,在于。但是后面我发现了一种更简练而且效率更高的方法:单调队列(我自己的命名,可以平均线性时间得到最大\小值)。结合最小\大栈的思路,和两个栈构成一个队列的思路完成。可在常数时间内得到栈的最值。原创 2019-07-19 01:36:46 · 226 阅读 · 0 评论 -
3sum 及TreeMap的线性遍历
此题我的思路是,先形成一个 num与其频率的 treeMap, 然后每次选定一个左边的num,这样其他两数必在此key的右边,而且其和也被决定了,可用左右两指针互相逼近的方法获得。遍历左边num的时间为O(n), 找右边两数也是O(n),所以时间复杂为O(n)。应该说这已经是优化过的算法了,然后在实现中[https://leetcode.com/submissions/detail/2456...原创 2019-07-24 01:42:30 · 160 阅读 · 0 评论 -
Convert Sorted List to Balanced Binary Search Tree 二叉树遍历中的自底向上
一般二叉树遍历都是自顶向下的,这样自然。但是也有用到自底向上的时候,如下例:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/discuss/?currentPage=1&orderBy=hot&query=可观察到我的第一次ac和第二次ac,代码结构相同,关键区别在于第二次用到了自底...原创 2019-07-16 23:47:40 · 155 阅读 · 0 评论 -
运用排列组合直接解62. Unique Paths
题目:https://leetcode.com/problems/unique-paths/典型思路是用dp来解,时间,空间均为O(n): public int uniquePaths(int m, int n) { int[] ans = new int[n]; Arrays.fill(ans,1); for(int i=1;i<m...原创 2019-07-20 02:40:57 · 118 阅读 · 0 评论 -
由google kicstart 引出的堆溢出问题
kickstart c轮第一题Wiggle Walk看起来很简单,没想到却暗藏了内存溢出的坑。我很快实现,并发现怎么样都是RE,又不知道到底是什么错误,怀疑了各种比如数组索引溢出,甚至输入输出等,找了好久找不出来,烦死个人。最后为了测试极限情况boolean[][] visit = new boolean[R+1][C+1]; 改成了 boolean[][] visit = new boolean...原创 2019-07-24 21:26:16 · 107 阅读 · 0 评论 -
求两侧最近的更小点,用单调栈解Largest Rectangle in Histogram和trapping-rain-water
参考了两种解法,最后用以中间的某点为高度,快速分别求左右边最近的比它高的点为整体思路,以最大栈为实现方式,实现了: public int largestRectangleArea(int[] heights) { int max = 0; Stack<Integer> maxst = new Stack<Integer>() { //简化版最大栈,直观表现为单调不...原创 2019-07-25 18:48:57 · 128 阅读 · 0 评论 -
银联比赛之码队弟弟求和
官方给出的解答为:此题有三大关键点:1,我称之为求余的分配律,详见https://www.geeksforgeeks.org/modulo-1097-1000000007/( a + b) % c = ( ( a % c ) + ( b % c ) ) % c( a * b) % c = ( ( a % c ) * ( b % c ) ) % c( a – b) % c = ( (...原创 2019-07-22 00:09:39 · 194 阅读 · 0 评论 -
怎么判断溢出
转自https://blog.csdn.net/qq_33330687/article/details/81626157jdk1.8及以上,可用Math的静态方法直接调用:加法:public static int addExact(int x, int y) { int r = x + y; // HD 2-12 Overflow iff both argum...转载 2019-08-04 23:26:26 · 773 阅读 · 0 评论 -
竖向使用单调栈+横向使用单调队列,完美解决kick start c轮 Circuit Board
google的题果然都不是吃素的,值得细品啊,都是leetcode上的hard题变形+组合,如此题:Circuit Board,先从相对简单的set 1开始解, 按照官方解析中的“we first define Pi,j as the maximum number of contigious cells on the right of the cell i, j . We immediately...原创 2019-07-26 22:35:52 · 127 阅读 · 0 评论 -
未解之题
kickstart B轮第二题Energy Stones,这里提供了java解法。此题用01背包来解,难点在于普通的背包,各个item加入的顺序是无所谓的,但此题的item(具体来说就是stone)不一样,有关系。关键是为什么要按this.seconds * other.reduce降序排列,没搞明白。再举个例子,c轮第三题Catch Some也是用背包来解。也是两维dp还不够,因为有个特殊的i...原创 2019-07-27 20:19:31 · 105 阅读 · 0 评论 -
美团第一题,黑白矩阵
已经一个矩阵,求将其转化为黑白矩阵的最少改变数字的次数,input:3 31 1 11 5 11 1 1ans:4,因为5 1 51 5 15 1 5又有input:3 31 1 11 1 11 1 1ans:4,因为1 2 12 1 21 2 1我在本机上通过的代码:import java.util.*;import java.util.Map.En...原创 2019-04-23 22:31:53 · 287 阅读 · 0 评论