leetcode
2NaCl
主攻Java后端开发与云计算Paas平台、离线大数据平台相关
展开
-
(Java)leetcode 300. 最长上升子序列
本题则是采用一般的dp。设dp[i]为我们最长子序列在扫描到下标为i的数字的时候,最长子序列的长度。设nums[j]和nums[i]其中,nums[j]只在前i个下标的数字中进行扫描。当扫描出来有满足nums[j]<nums[i]的情况也就是发现了新的满足条件的数字。我们开始初始化dp数组里面的值为1,每当发现一个满足条件的数字,就+1。然后针对这种情况,计算出每一次满足条件的dp[...原创 2020-03-14 14:31:28 · 250 阅读 · 0 评论 -
(Golang)leetcode 1.两数之和
仅仅作为Go语言入门,感受一下语法的案例。func twoSum(nums []int, target int) []int { a:=make([]int,0) for index1,i := range nums{ for index2,j := range nums[index1+1:]{ if i+j==target{ ...原创 2020-01-22 19:35:07 · 267 阅读 · 0 评论 -
(java)leetcode 131.分割回文串
题目解读:此题目是一道经典的考验回溯方面知识的算法题,意在让我们递归得到子串的同时,去筛选出回文序列,添加到List下,最后返回。题目思路:正如我们初步对题目解读的那样,我们需要做到以下几点:递归字符串筛选回文序列第一步:我们递归字符串的方法是这样的,假设我们有一个字符串 str = abcbaa现在我们要找出其中的回文子串。我的思路是这样的:对str进行一个循环+切割,比如第一...原创 2019-12-03 22:10:36 · 283 阅读 · 0 评论 -
(java)leetcode 199.二叉树的右视图
讲实话,刚看见这个题,还以为单纯递归右节点了,提交一次之后才知道,原来意思是提取每一层最右节点。所以还是使用的老套的递归来解决。但是因为是求最右的结点,所以,我们就需要,先递归最右:root = root.right,如果root==null,我们就跳出递归,然后让root = root.left,看看是不是空,再为空再退,直到退到根为止。其实和leetcode大多数二叉树套路是一样的。...原创 2019-12-03 08:56:45 · 452 阅读 · 0 评论 -
(java)leetcode 101.对称二叉树
题目解读:一看见树,我们就会第一想到递归解决,第二想到用栈/队列解决,这题选择递归还是比较方便的,这个对称二叉树,我们就把第二层的两个非叶子节点当做root,按照对称的顺序去递归即可,其实还是比较简单的。题目思路:我们可以先对根节点做边界处理,然后得到根的左节点和右节点,当做树根,去左右依次递归。/** * Definition for a binary tree node. * p...原创 2019-11-24 20:52:09 · 125 阅读 · 0 评论 -
(java)leetcode 147.对链表进行插入排序
题目解读:题目给了我们基本的链表的结构:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */然后我们依据人家传过来的链表头,通过next,获...原创 2019-11-24 19:08:03 · 376 阅读 · 0 评论 -
(java)leetcode 22.括号生成
题目解读:一个经典的回溯题,一说到回溯,就容易让人想起dfs,一说起dfs就让人想起暴力递归。而这道题,便是可以以安插“(”与“)”的位置为递归的路径去解题。题目思路:此题目我们的最终目的就是统计出来...原创 2019-11-15 08:52:19 · 147 阅读 · 0 评论 -
(java)leetcode 15.三数之和
题目解读:这道题是两数之和的延伸,在基础上变得更难了一些,但是可以看到题目中要求是找出三个和为0的元素,也就是定值,而且还要求,nums里面的每一个数字只能使用一遍。题目思考:由上面所给出的信息,我们或许可以得到以下想法:如果我们暴力循环,肯定超时既然是和为0,那么是否可以判定,abc最小的一个如果大于0,或者abc最大的一个小于0,都不可能成立,所以可以略过提升性能既然要求数字只...原创 2019-11-08 00:08:14 · 129 阅读 · 0 评论 -
(java)leetcode 26.删除排序数组中的重复项
题目思路:本题目的考点是快慢指针,做出来很简单,但是额外要求了空间复杂度为O(1),所以我们首选快慢指针,因为数组已经被排好了,所以我们准备好快指针,从下标1开始遍历和慢指针从0开始遍历,我们只需要在nums[i]=nums[i+1]的时候,直接跳过,继续比较nums[i]与nums[i+2]… …,在nums[i]!=nums[i+n]的时候,让慢指针进一位,这样也就制造出了我们想要的数组。...原创 2019-11-05 22:23:03 · 285 阅读 · 0 评论 -
(java)leetcode 36.有效的数独
题目分析:首先这道题不用考虑数独的必须有解,只需要满足题目的三个要求即可:行不能有重复列不能有重复3*3的方格内不能有重复的题目思路:做这题的时候,我们免不了要去进行n²的遍历去解决,意思就是遍历到不合格的那一个立即return false,不然就一直遍历到最后一个,关键是我们要怎么去遍历。...原创 2019-11-05 22:03:28 · 269 阅读 · 0 评论 -
(java) leetcode 64.最小路径和
此题是一个很经典的动态规划题目了,思路不难,但是确实很体现动态规划的思想。然后我们就来分析一下这个题目。题目理解:首先这是一个m*n的矩阵,我们需要寻找一条最短路径,从左上到右下,我们不能单纯考虑向右一个单位和向下一个单位哪个更短,这就变成贪心了,所以显然是行不通的,除此之外,还要考虑m和n范围的问题,不能ArraysOutOfException,所以我们可以有这样的一种思路。题目思路...原创 2019-10-30 01:33:10 · 449 阅读 · 0 评论 -
(java) leetcode17.电话号码的字母组合
第一步首先阅读题目,最开始的思路就是,1和0这个麻烦的数字已经被排除出去了,我们要做的很简单,就是输入2,可以映射到abc,输入3,映射到def……以此类推,我们可以得知是一种映射关系,而映射关系存在一对一,一对多,多对一,多对多,这里的情况很明显,只能是一对一(string)或者一对多(char[]),其实在这种情况下呢,映射关系建立成这两种都是可以的,但是因为string里封装的api多...原创 2019-10-25 00:51:47 · 238 阅读 · 0 评论 -
(java)leetcode 49 字母异位词分组
题目思路:本题思路主要是考研哈希,我们可以从题目中了解到这个字符串数组分组后的每个分组,里面包含的元素相同,但是排序不同,那么我们可以得知每个分组里的字符串进行abcd的这种排序之后是相同的结果,所以我们就可以把排序过后的结果当做key,最后按照key去分组聚合就可以了。我们首先得到这个key,然后如果key存在,就直接add进去,不存在就先new一个List再add就可以了 class ...原创 2019-10-19 09:57:56 · 137 阅读 · 0 评论 -
(java)leetcode 46 全排列
全排列是一个很经典的用递归算法解决的题目,也是先说明一下对题目的理解。1的全排列是[1]1,2的全排列是[1,2][2,1]1,2,3的全排列的[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,2,1],[3,1,2]我们可以看出:1的全排列只有1个1,2的全排列有2*1个1,2,3的全排列有3 * 2 * 1个所以,n个数字的全排列的个数为n!个我们以1,...原创 2019-10-19 02:03:20 · 248 阅读 · 0 评论 -
(java)leetcode 31.下一个排列
先不说本题思路,先列举几个例子给大家看看,然后找找规律:14231->14321->1432125413->25431->254311654321->2654311->2113456185964->186954->186459不知道是否大家可以发现规律,前面两个和后面两个有鲜明的对比。我们从这四个例子中,可以得出几个信息:在数组中肯...原创 2019-10-18 02:54:31 · 166 阅读 · 0 评论 -
leetcode-63-dp经典算法题笔记
此题和leetcode 62题状态转移方程是一样的,但是迁入了障碍物的概念,如果需要知道状态转移方程的思路,可以参考https://blog.csdn.net/qq_41936805/article/details/100179828解出此题,我们必须知道对于障碍物的特点如下:障碍处的dp值=0我们已经知道了,动态转移方程为dp[i][j]=dp[i][j-1]+dp[i-1][j]...原创 2019-09-01 13:12:21 · 272 阅读 · 0 评论 -
leetcode-05-dp经典算法题笔记
题目概述:首先我们看见这个题的目的,是要找到一个字符串中的最长回文子字符串,换句话说,正着倒着都一样。思路:最简单的办法,就是n²穷举,但是这是不行的肯定,所以我们也是采用动态规划的思路去解决这个问题。分为以下几步:<1> 排除特殊情况 传进来的字符串可能是空字符串,所以我们需要将这种特殊情况排除掉<2> 分类讨论 :(1)字符串对称方式形如“aba”(...原创 2019-09-03 19:56:00 · 277 阅读 · 0 评论 -
leetcode-70-dp经典算法题笔记
此题是一个经典的爬楼梯模型,是一个经典的使用dp去解决的问题之一。先介绍一个题目:读完题目之后,我们也是先按照次序列举出来其他的几种情况:当n=1的时候,爬楼梯的方法是1所以共1种。当n=2的时候,爬楼梯的方法是1+1,2所以共2种。当n=3的时候,爬楼梯的方法是1+1+1,1+2,2+1所以共3种。当n=4的时候,爬楼梯的方法是1+1+1+1,1+1+2,1+...原创 2019-09-15 17:47:08 · 216 阅读 · 0 评论 -
leetcode-165-字符串经典算法题笔记
其实题目的意思很直白,在正常的情况下,比较版本号,大家估计也就都懂了,而01和001转换成Integer的时候,实际都为1,这也就提示我们可以用split拆分之后,直接Integer.valueOf去比较大小就可以了。特殊情况 : 两个version的length不一样长,在正常遍历的时候会发生数组越界,就会报错了。所以我们的难点就在于上面难点特殊情况上。解决这个方法有两个方法:最好理...原创 2019-09-23 00:48:13 · 330 阅读 · 0 评论 -
(java)Leetcode1018. 可被 5 整除的二进制前缀
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。题目不难理解,但是如果我们用暴力解法是肯定不行的,会超过int或者long的最大位数,所以我们就要换新的思路去解决...原创 2019-10-03 13:43:16 · 267 阅读 · 0 评论 -
(java)leetcode 415 字符串相加
作为字符串相乘的缩水版,其实思路都大多是相同的,但是我们要知道的是,暴力是解决不了问题的,我们需要用巧的办法去解决问题。下面我来说一下这道题的思路,也是最容易想出来的一种思路,列竖式相加。既然要列竖式,我们都知道竖式是从各位去开始计算,所以我们也需要用str.charAt(index)来模拟这两个str,从最后开始,一位数加一位数的这个步骤。 而进位,我们可以用除法运算,单独处理。举一个...原创 2019-10-04 20:22:21 · 303 阅读 · 0 评论 -
(java)leetcode 43 字符串相乘
如果没做过leetcode 415 字符串相加的话,建议先去做那个铺垫一下,我也写过415的解题思路,传送门:https://blog.csdn.net/qq_41936805/article/details/102090371然后开始说这个题的解决步骤:首先这个题,是不能暴力破解的,总体思路和415是一样的,我是列的竖式,然后去一位一位的加,然后也是在循环的时候将进位也考虑在内计算,最后排除...原创 2019-10-05 02:20:28 · 241 阅读 · 0 评论 -
(java)leetcode21 合并两个有序链表
虽然是一个简单题,但是毕竟复习,也还是简单做一个笔记。链表是数据结构最开始也最基础的内容了,此题的意思也比较简单,就是单纯进行链表排序的二合一而已。核心思路:首先创建一张空链表,用作存储我们二合一之后的返回结果。遍历l1,l2 比较他们当前的结点(val),选出比较小的val值,被我们创建的新链表的next去指向这个结点。之后,我们创建的链表和被我们指向的链表,都进入下一个结点。...原创 2019-10-11 18:10:01 · 200 阅读 · 0 评论 -
leetcode-62-dp经典算法题笔记
然后开始分析一下,首先知道,这题肯定是dp思路的,虽然也能回溯,但是主要还是说dp,做个笔记。做dp题最重要的就是写出状态转移方程。我先举几个例子,从中寻找一下规律,因为dp思想规律都是差不多的,只不过题型太多而已。我每一个例子c(m,n)的结果都是指,到右下角移动的总步数咱们就从最小的1*1来说 c(1,1)=11 * 2 / 2 * 1 : c(1,2)/c(2,1)=12 *...原创 2019-09-01 09:19:07 · 249 阅读 · 0 评论