渣渣的算法历练之路
文章平均质量分 57
我也木得办法,但是算法还是要练的,不然面试得 GG 啊。
OneDeveloper
当你无所事事的时候,就得好好想想还缺少什么!!!
展开
-
【LeetCode】134. 加油站
(注意题目给出的条件)1. 暴力破解如果对于起点 index 有 gas[index] - cost[index] < 0,则 index 肯定无法作为起点。因此肯定是从 start = x && gas[x] - cost[x] >= 0 的点开始,该点才有可能是答案。为什么说是有可能,因为还要计算该点之后的所有点是否符合要求。否则就要再换一个起点继续去...原创 2019-08-24 11:32:05 · 806 阅读 · 0 评论 -
【LeetCode】55. 跳跃游戏
解法 1从左到右遍历数组,假设当 index = x1 时,nums[x1] = 0,则继续向右遍历,直接遇到不为 0 的元素,假设此时 index = x2。且在遍历的时候,记录 index 在 x1 之前的元素,有 maxIndex = index+nums[index](maxIndex 表示下标为 index 对应的元素值所能跨到最远位置)。如果 maxIndex < x2,...原创 2019-08-22 22:45:53 · 194 阅读 · 0 评论 -
【剑指 2】面试题 43:1~n 整数中 1 出现的次数
题目:输入一个整数 n,求 1~n 这 n 个整数的十进制表示中 1 出现的次数。例如,输入 12,1~12 这些整数中包含 1 的数字有 1、10、11 和 12,1 一共出现了 5 此。对于 X ∈ [1, 9],1~n 整数中 X 出现的次数在算法一样。(0 的比较特殊,不过大致思想类似)。解题思路:分别以 12493、12593、12693 为例,计算数字 5 出现的次数。其中,...原创 2019-06-05 21:31:38 · 333 阅读 · 0 评论 -
【剑指 2】面试题 44:数字序列中某一位的数字
题目:数字以 0123456789101112131415... 的格式序列化到一个字符序列中。在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。写出一个函数,求任意第 n 位对应的数字。解题思路:题目中的序列,存在一个规律:即依次由一位的数字,两位的数字,三位的数字,X 位的数字,对应的数字序列从小到大,拼接而成。第 0 至第 10 位由...原创 2019-06-03 23:41:09 · 250 阅读 · 0 评论 -
【基础算法】计数排序
具体的讲解参见:理解计数排序算法的原理和实现主要的原理,就是用一个辅助数组 b,对于目标数组 a,对于 a 中的每个元素 a[i],将其出现的次数映射到 b[j] 中,其中有 j = a[i]。然后需要注意的三个点就是:1、尽量的节省空间,假设有数组 10, 11, 20, 30,辅助数组的大小没必要为 30,可以根据数组中的最大值与最小值来进行优化。2、要支持负数的排序3、具有稳定性,...原创 2019-03-11 20:32:41 · 765 阅读 · 0 评论 -
【基础算法】堆排序
具体的演示过程可以参考:https://www.cnblogs.com/chengxiao/p/6129630.html// 最大堆排序,可以得到递增序列public void heapSort(int[] a) { if (a == null || a.length == 0) { return; } // 从后往前遍历所有元素,构建出最大堆 ...原创 2019-03-02 00:07:46 · 404 阅读 · 0 评论 -
【基础算法】归并排序
可以参考:35. 排序算法(8):归并排序的迭代实现 的图解这里在实现上,把递归与迭代的都贴出来:首先是递归的实现,比较简单明了public void digui(int[] a, int left, int right) { if (left >= right) { return; } int mid = (right + left) / 2...原创 2019-02-27 21:52:50 · 213 阅读 · 0 评论 -
【基础算法】快速排序
采用交换法的实现:// 递归实现public void digui(int[] a, int left, int right) { if (left >= right) return; int pivot = left; int l = left + 1; int r = right; // 注意三个地方为 l <= r(而不是 l <...原创 2019-02-25 23:36:03 · 600 阅读 · 0 评论 -
【基础算法】直接插入排序法
引用自:https://blog.csdn.net/dd864140130/article/details/50845945插入排序的基本思想是: 将一个待排序的记录,按照其关键字的大小将其插入到前边已经排好序的子序列的适当的位置,直到全部插入完毕。这就像我们在玩扑克牌时,将每一张拍插入到其他已经有序的牌中适当的位置。在计算及中,为了给要插入的元素腾出位置,需要将其余所有元素在插入位置之前都...原创 2019-02-21 23:58:33 · 2611 阅读 · 0 评论 -
【基础算法】冒泡排序法
public void sort(int[] a) { if (a == null || a.length == 0) return; // 外层的循环代表遍历的次数 for (int i = 0; i &lt; a.length - 1; i++) { boolean flag = true; // 内层的循环是为了实现相邻两元素的交换...原创 2019-02-20 22:13:07 · 713 阅读 · 0 评论 -
【基础算法】简答选择排序法
选择排序法,核心思想就是,对于数组 A,假设其长度为 len,则第一次遍历,找到 [0,len-1] 中最小的那一个放在 A[0] 的位置,第二次遍历,找到 [1,len-1] 中最小的那一个放在 A[1] 的位置…如此循环,直到整个数组有序为止。该排序是一种不稳定的排序。public void sort(int[] a) { if (a == null || a.length =...原创 2019-02-19 22:20:40 · 345 阅读 · 0 评论 -
【基础算法】二分查找法
二分查找法的前提就是针对于有序的序列,基于分治的思想,提高查询的效率。参考:https://zh.wikipedia.org/wiki/二分搜索算法迭代实现:public static int binarySearch(int[] arr, int aim) { if (arr == null || arr.length == 0) return -1; int left =...原创 2019-02-18 21:45:55 · 431 阅读 · 0 评论 -
【探索-字节跳动】朋友圈
dfs参考文章:Leetcode学习笔记-547-朋友圈使用深度优先遍历(dfs),如果学生 A 与 B 是好友,则 A 肯定也与 B 的好友圈的任意学生也是好友关系,即有传递性,因此,在遍历到 A 与 B 是好友的时候,还要遍历 B 的好友,与 B 的好友的好友,即会最终把这个圈子的人都遍历到。public int findCircleNum(int[][] M) { if (M...原创 2019-01-23 23:11:22 · 1106 阅读 · 0 评论 -
【探索-字节跳动】最长连续序列
常规做法,就是先排序,再去处理。public int longestConsecutive(int[] nums) { if (nums == null || nums.length == 0) return 0; Arrays.sort(nums); int max = 1; int tmp = 1; for (int i = 0, len ...原创 2019-01-21 20:06:09 · 1943 阅读 · 0 评论 -
【探索-字节跳动】复原IP地址
可以使用深搜,看每一次的组合是不是符合条件。public List<String> restoreIpAddresses(String s) { int[] segsStart = new int[4]; dfs(s, segsStart, 0); return result;}public void dfs(String s, int[] segsS...原创 2018-12-10 20:51:18 · 858 阅读 · 0 评论 -
【探索-字节跳动】简化路径
以输入的 / 作为分割,来进行判断,因此有如下几种情况:1、多个连续 / 的情况,则忽略后面的2、一个或者多个连续 . 的情况 (1) 只有一个点的话,则表示还是在当前目录 (2) 两个点的话,则要返回到上一级目录 (3) 三个或者以上的点,则不进处理,正常遍历3、以及正常的路径名,而且路径名里面也可以包含 .// 执行用时:10 mspublic String simplif...原创 2018-12-10 19:36:17 · 490 阅读 · 0 评论 -
【探索-字节跳动】字符串相乘
题目中已经限制了算法的实现途径,即不能用 Java 中现成的 API 去实现,也不能直接转换为整形去相乘。而且这里会涉及到大数,所以我的想法是利用我们手写乘法时的规则饿,将 num1 和 num2 中位数较长的去直接乘以 位数较短的每一位,然后依次把结果加起来即可。// 执行用时:32 mspublic String multiply(String num1, String num2) {...原创 2018-11-26 15:05:42 · 305 阅读 · 0 评论 -
【探索-字节跳动】最长公共前缀
解法一先找出最短的那个字符串,然后遍历该字符串的每一个字符,并与剩余字符串的对应位置的字符比较,如果有出现不一致的时候,就表明公共前缀截止了。public String longestCommonPrefix(String[] strs) { if (strs==null||strs.length==0) return &amp;quot;&amp;quot;; if (strs.length==1) retu...原创 2018-11-22 22:08:00 · 387 阅读 · 0 评论 -
【探索-字节跳动】字符串的排列
这题的核心问题就是 “如何对一个字符串建立一个无关于字符串内字母顺序的唯一映射”。类似于这种问题的,之前有接触过,因为题目给出了字符只包含小写字母,所以我就借助一个辅助数组,对于字符串 s1,遍历其每个字符,并把出现的相同字母的数量映射到该数组中,这样就解决了上述问题。(貌似术语就是使用 字典 的方式)然后利用固定大小的滑窗的思想,针对 s2 中的与 s1 长度相同的子串,也用该方法进行映射...原创 2018-11-24 11:09:30 · 896 阅读 · 0 评论 -
【探索-中级算法】全排列
参考自:https://my.oschina.net/u/3744313/blog/1923933解法一:基于回溯的思想,借助一个辅助数组用于记录访问状态。List&lt;List&lt;Integer&gt;&gt; result = new ArrayList&lt;&gt;();public List&lt;List&lt;Integer&gt;&a原创 2018-11-15 10:22:30 · 142 阅读 · 0 评论 -
【探索-中级算法】每个节点的右向指针
要注意题目给出的条件,其中,使用递归是可以,而使用递归,也是最直观的,且可以假设是一个完美二叉树,因此在处理的时候,可以减少判断逻辑。先上代码:public void connect(TreeLinkNode root) { if (root!=null) { root.next = null; method(root.left, root, null...原创 2018-11-08 15:56:15 · 339 阅读 · 0 评论 -
【探索-中级算法】递增的三元子序列
最先想到的思路,就是用一个 Map&amp;lt;Integer, List&amp;lt;Integer&amp;gt;&amp;gt;,其中 key 对应下标 index,value 为当 index_x &amp;gt; index 时,如果 nums[index_x] &amp;gt; nums[index],则将该 index_x 添加到 index 对应到链表中,该链表的作用就是收集在 index原创 2018-10-31 19:50:34 · 291 阅读 · 0 评论 -
【探索-中级算法】字谜分组
解题的关键思想就是将字符串建立起无关于字母顺序,只关于字母个数的唯一映射关系,这样 ,对于同一组符合要求的字符串,则它们的映射都是一样的,以此作为分组的依据。具体的解题方法,暂时想到了两种。1、将字符串映射为字母+数字的组合,如 a1b2c3,这样是符合上述条件的。public static List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(Str...原创 2018-10-25 19:30:11 · 329 阅读 · 0 评论 -
【探索-中级算法】矩阵置零
参考链接:https://www.jianshu.com/p/d0017b1e38c4O(mn) 的额外空间public void setZeroes1(int[][] matrix) { if (matrix == null || matrix[0] == null || matrix[0].length &amp;amp;lt; 1) return; // 结合额外的辅助数组来判断 ...原创 2018-10-24 20:33:28 · 224 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
参考链接:https://blog.csdn.net/happyaaaaaaaaaaa/article/details/51635367在参考原本的基础上,使用一个辅助数组,保存递归中的值,避免重复计算。//递归实现public List<TreeNode> generateTrees(int n) { if (n < 1) return new A...原创 2018-05-03 11:52:14 · 3074 阅读 · 0 评论 -
300. 最长上升子序列
1、常规动归思想首先使用的是常规的动归思想,时间复杂度为 O(n^2),不多解释,只是要注意,dp[i] 每次都是在 dp[0] - dp[i-1] 中寻找最大的值 + 1。public int lengthOfLIS(int[] nums) { if (nums == null || nums.length == 0) return 0; int[] dp = n...转载 2018-04-23 10:52:45 · 807 阅读 · 0 评论 -
718. Maximum Length of Repeated Subarray
题目的大概意思,就是求两个数组中相同的最大连续子序列的长度。题目自然是用动归来解决,但是一开始我想错来思路,代码如下:public int findLength2(int[] A, int[] B) { int[][] dp = new int[A.length][B.length]; dp[0][0] = A[0] == B[0] ? 1 : 0; ...原创 2018-04-21 19:51:06 · 154 阅读 · 0 评论 -
【探索-中级算法】电话号码的字母组合
回溯法引用自:https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标...原创 2018-11-12 14:30:32 · 333 阅读 · 0 评论 -
【探索-中级算法】奇偶链表
首先,一定要理解题目。然后就是规定限制条件,要使用原地算法,空间复杂度要为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。1、基于原地算法,但是时间复杂度为 O(n^2)public ListNode oddEvenList(ListNode head) { if (head==null) return head; ListNode node = h...原创 2018-11-02 14:12:22 · 225 阅读 · 0 评论 -
【探索-中级算法】三数之和
参考链接:LeetCode总结-K-Sum问题本文介绍的解题思想的核心就是排序,排序有两个目的,第一个是次要的,即方便排除重复的组合。第二个就是使得可以按照递增或者递减方便的移动指针 l、r。在排序之后,就可以对数组进行遍历,目标就是找到符合 nums[l] + nums[r] == -target 的组合,而 target 是固定不变的,只要动态的寻找符合条件的 nums[l] 、num...原创 2018-10-23 16:15:30 · 337 阅读 · 2 评论 -
96. 不同的二叉搜索树
附二叉搜索树的性质:1、若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;2、若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;3、任意节点的左、右子树也分别为二叉查找树;4、没有键值相等的节点。参考链接:https://blog.csdn.net/shinanhualiu/article/details/50225093解题的思路,...原创 2018-04-20 12:53:29 · 790 阅读 · 0 评论 -
740. 删除与获得点数
参考链接:https://blog.csdn.net/liuchuo/article/details/79573624首先需要注意到 nums[i] 的范围为 [1,10000],然后是题目的条件,如果获得了 nums[i] 元素对应的点数,则要删除 nums[i] 元素,且还需要删除 nums 中所有值为 (nums[i]-1) 或者 (nums[i]+1) 的元素,这里需要注意,n...原创 2018-04-19 11:22:19 · 971 阅读 · 0 评论 -
343. 整数拆分
1、数学思维参考:http://www.cnblogs.com/shihaochangeworld/p/5547436.htmlpublic static int integerBreak(int n) { if(n <= 3) return n - 1; if (n%2==0) { int numOf3 = n / 6 * 2; ...原创 2018-04-16 13:26:52 · 843 阅读 · 0 评论 -
392. 判断子序列
1、动归首先想到的就是利用动归,先从简单的开始,利用一个二维辅助数组 dp[i][j],表示 s.sub(0,i) 是否为 t.sub(0,j)的子序列,其中有转换方程:if (dp[i][j - 1]) dp[i][j] = true;else dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i) == t.charAt(j))...原创 2018-04-15 16:49:29 · 1338 阅读 · 1 评论 -
712. 两个字符串的最小ASCII删除和
参考链接:http://www.cnblogs.com/A-Little-Nut/p/8439094.html利用动归的思想,使用二维辅助数组 dp[i][j],其含义代表字符串 s1 的子串 s1.sub(0,i-1) 和 s2 的子串 s2.sub(0,j-1) 需删除字符的ASCII值的最小和。 (因为字符串的对于每个字符的位置是从基数 0 开始的)根据上述说明的 dp[i...原创 2018-04-14 22:40:58 · 953 阅读 · 0 评论 -
486. 预测赢家
原题链接:https://leetcode-cn.com/problems/predict-the-winner/description/该题,在解法上可以使用递归与动归两种思路解决,而这里选择的使用动归来实现。首先要注意到题目中,假设每个玩家的玩法都会使他的分数最大化,并且玩家 1 为先手。public boolean PredictTheWinner(int[] num...原创 2018-04-13 23:04:56 · 2284 阅读 · 0 评论 -
647. 回文子串
题目链接:https://leetcode-cn.com/problems/palindromic-substrings/description/基于动态规划 - 1这题基于动态规划的思想来解答的话,实现思想参考自 :http://www.bkjia.com/Cyy/988261.html借助一个辅助二维数组 dp[i][j],其中 i 和 j 一起作用,表示字符串 s 中...原创 2018-04-08 17:15:15 · 2108 阅读 · 0 评论 -
【探索-中级算法】颜色分类
初级解法一首先,使用最简单的解法,可以拆分成两步。第一步:扫描数组,先把 0 放在最前面,把 1 和 2 放在最后面(即使是混淆的也没关系)。第二步:再在混淆的 1 和 2 中进行排序。每一步的排序,都需要借助两个指针。public void sortColors(int[] nums) { if (nums == null || nums.length == 0) retur...原创 2018-11-20 20:24:42 · 719 阅读 · 0 评论 -
【探索-中级算法】单词搜索
解法一 递归结合回溯与深搜,因同一单元格不能被重复使用,因此借助一个辅助数组用于记录单元格是否被访问过。需要剪枝的策略:1.当前元素与单词的对应位置的字母不一致2.当前元素已经被遍历过3.超出了 borad 的边界public boolean exist(char[][] board, String word) { if (board==null||board[0]==nu...原创 2018-11-17 16:53:46 · 300 阅读 · 0 评论 -
【探索-字节跳动】翻转字符串里的单词
实现思想,就是先整个的把字符串倒转过来,如 the sky is blue 直接倒转成 eulb si yks eht,然后,再单独把每个单词还原即可。另外还需要注意说明中的条件。public String reverseWords(String s) { if (s==null||s.length()==0) return &amp;amp;quot;&amp;amp;quot;; char[] chars = s.toCha...原创 2018-11-27 16:20:31 · 354 阅读 · 0 评论