
刷题
下个路口见_20
Keep coidng!Keep learning!
展开
-
leetcode股票买卖问题【六连杀】
一次交易,找到买点最低,卖点最高即可。但限制条件是:卖点必须在买点之后。所以很适合栈来操作,遇到比栈顶小的元素,就入栈,否则,将当前元素减去栈顶元素,然后不断更新最大值即可。class Solution { public int maxProfit(int[] prices) { if (prices == null || prices.length == 0){ return 0; } Deque<Inte..原创 2020-12-19 16:24:55 · 242 阅读 · 0 评论 -
leetcode67:Add Binary
思路:从右边开始,逐位相加,包括进位。代码:public class AddBinary67 { public static void main(String[] args) {// System.out.println(addBinary("11", "1")); System.out.println(addBinary("1", "111")); } publi...原创 2018-09-23 20:59:58 · 317 阅读 · 0 评论 -
leetcode70:Climbing Stairs
思路:设f(n)为从1爬到第n层台阶的走法,则f(n)=f(n-1)+f(n-2)。代码:public class ClimbingStairs { public static void main(String[] args) { System.out.println(climbStairs2(44)); } public static int climbStair...原创 2018-09-24 14:45:32 · 295 阅读 · 0 评论 -
leetcode72:Edit Distance
思路:设dp[i][j]表示word1中0-i个字符转换成word2中0-j个字符需要的最少次数,先对0行和0列所有元素进行初始化,然后从1行1列开始往后递推,最终将dp数组填充满,dp[row][col]即为最终结果。状态转移方程为:if(word1[i]==word2[j]):dp[i][j]=dp[i-1][j-1];else:dp[i][j]=Math.min(dp...原创 2018-09-24 16:11:39 · 216 阅读 · 0 评论 -
leetcode73:Set Matrix Zeroes
思路:使用常量的额外空间,肯定是要用数组的某一部分来记录0的位置,所以考虑采用第0行和第0列来记录(1,1)-->(n,n)中0的位置,因为之后第0行和第0列的值会改变,所以需要提前判断0行0列是否有0,最后做处理。代码:public class SetMatrixZeroes { public static void main(String[] args) { i...原创 2018-09-25 10:11:02 · 308 阅读 · 0 评论 -
leetcode22: Generate Parentheses
思路:最终符合要求的字符串中,左括号和右括号个数都是n,而且在字符串生成过程中,左括号的剩余个数一定小于等于右括号剩余个数,如果左右括号剩余个数都为0,说明找到一个符合题意的字符串了,保存下来。所以可以采用递归,分别添加左括号和右括号,根据以上条件设置递归出口。代码:public class GenerateParentheses22 { public static void m...原创 2018-09-11 09:54:35 · 192 阅读 · 0 评论 -
leetcode24:Swap Nodes in Pairs
思路:关于链表的题,主要将指针关系理清,在指针改变之前,需要将指针的后继节点保存,防止链表断开。代码:public class SwapNodesinPairs24 { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = new ListNo...原创 2018-09-11 10:43:05 · 379 阅读 · 0 评论 -
【面试题】leetcode34:Find First and Last Position of Element in Sorted Array
思路:二分查找找到目标值,然后从目标值左右分别进行搜索,如果和目标值相同,则更新下标,否则结束(因为有序)。public class FindFirstandLastPositionofElementinSortedArray34 { public static void main(String[] args) { int num[] = { 5, 7, 7, 8, 8, 10 ...原创 2018-09-20 09:33:32 · 248 阅读 · 0 评论 -
【面试题】棋盘走法总数问题
题目:给定一个mxn的棋盘,每次只能向右或向下走,从左上角走到右下角,有多少中走法?思路:可以使用动态规划,状态转移方程为:dp[m][n]=dp[m-1][n]+dp[m][n-1],也可以使用递归来实现。public class QiPan { public static void main(String[] args) { System.out.println(fun...原创 2018-09-20 09:44:38 · 1716 阅读 · 0 评论 -
leetcode38:Count and Say
思路:对每个字符串判断连续相同为的个数,然后进行拼接即可。代码:public class CountAndSay { public static void main(String[] args) { System.out.println(countAndSay(1)); } public static String countAndSay(int n) { Str...原创 2018-09-21 15:21:06 · 198 阅读 · 0 评论 -
leetcode39:Combination Sum
思路:将数组中的每个点作为根节点,然后采用深度优先遍历即可,由于数字可以重复使用,所以递归时候注意下标。代码:public class CombinationSum39 { public static void main(String[] args) { int[] num ={2,3,5}; System.out.println(combinationSum(nu...原创 2018-09-21 15:46:40 · 249 阅读 · 0 评论 -
leetcode40:Combination Sum II
思路:本题在于数字不能重复使用,而且需要去重,可以先将数组排序,然后去重就方便了,依然采用深度优先的方法。代码:public class CombinationSumII { public static void main(String[] args) { int[] num = { 2, 5, 2, 1, 2 }; System.out.println(combina...原创 2018-09-21 16:40:43 · 293 阅读 · 0 评论 -
leetcode45:Jump Game II
1.首先选用了dp来做,结果超时了。代码:public class JumpGameII45 { public static void main(String[] args) { int[] nums = {2,3,1,1,4}; System.out.println(jump(nums)); } public static int jump(int[] nums...原创 2018-09-21 21:00:11 · 286 阅读 · 0 评论 -
leetcode46:Permutations
思路:排列问题,深度搜索+交换。代码:public class Permutations46 { public static void main(String[] args) { int[] num= {1,2,3}; System.out.println(permute(num)); } public static List<List<Integer...原创 2018-09-22 16:59:36 · 248 阅读 · 0 评论 -
leetcode47:Permutations II
思路:依然采用dfs+交换,多了去重步骤。代码:public class PermutationsII { public static void main(String[] args) { int[] num= {1,1,2}; System.out.println(permute(num)); } public static List<List<In...原创 2018-09-22 18:08:29 · 248 阅读 · 0 评论 -
【面试题】leetcode48:Rotate Image
瓜子二面面试题思路:主要找到旋转前后下标之间的对应关系,matrix[j][n-1 - i] = matrix[i][j],但是在遍历过程中原数组被改变了,所以需要提前将原数组拷贝一份。代码:public class RotateImage48 { public static void main(String[] args) { int[][] num = { { 1, ...原创 2018-09-22 18:43:51 · 435 阅读 · 0 评论 -
leetcode49:Group Anagrams
思路:这道题让我们群组给定字符串集中所有的错位词,所谓的错位词就是两个字符串中字母出现的次数都一样,只是位置不同,比如abc,bac, cba等它们就互为错位词,那么我们如何判断两者是否是错位词呢,我们发现如果把错位词的字符顺序重新排列,那么会得到相同的结果,所以重新排序是判断是否互为错位词的方法,由于错位词重新排序后都会得到相同的字符串,我们以此作为key,将所有错位词都保存到map中,然后...原创 2018-09-22 19:07:17 · 234 阅读 · 0 评论 -
leetcode50:Pow(x, n)
思路:直接用循环来做,会提示超时。我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。参考:http://www.cnblogs...原创 2018-09-23 10:02:53 · 238 阅读 · 0 评论 -
leetcode66:Plus One
思路:从后往前加,记录进位即可,但需要考虑各位全为9的情况,这样高位进位,需要将数组长度增加1个位置,这种情况出现的概率比较低,所以如果高位有进位,新开一个数组将原来计算的结果保存进去即可。...原创 2018-09-23 20:29:40 · 281 阅读 · 0 评论 -
leetcode64:Minimum Path Sum
思路:跟之前走方格的题差不多,只是状态转移方程稍微改变一下。dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];。代码:public class MinimumPathSum64 { public static void main(String[] args) {// int[][] num = { { ...原创 2018-09-23 20:06:35 · 333 阅读 · 0 评论 -
leetcode63:Unique Paths II
思路:在Unique Paths上多加了一些障碍点,做法同Unique Paths类似,只是在初始化和计算dp[i][j]的时候,需要判断i行j列是否为障碍点,如果是,表示路径不通,置为0,否则正常计算。dp[i][j]=dp[i - 1][j] + dp[i][j - 1]。代码:public class UniquePathsII63 { public static void...原创 2018-09-23 18:57:14 · 358 阅读 · 0 评论 -
LeetCode5. Longest Palindromic Substring
思路:采用动态规划来做,dp[i][j]表示s中下标i到下标j能否构成回文,递推公式为:dp[i, j] = 1 if i == j = s[i] == s[j] if j = i + 1 ...原创 2018-09-07 21:39:36 · 173 阅读 · 0 评论 -
leetcode26:Remove Duplicates from Sorted Array
参考:http://www.cnblogs.com/grandyang/p/4329128.html思路:我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数。代码:public class RemoveDupli...原创 2018-09-11 15:13:24 · 244 阅读 · 0 评论 -
LeetCode:3Sum
先用了dfs来做,结果超时了,重新考虑题目的特点。思路:可以先将数组排序,然后固定第一个数i,然后设定两个指针,一个从i+1开始,一个从num.length-1开始,判断这两个位置的数的和是否等于0-nums[i],如果大于目标值,则右边指针左移,如果小于目标值,则左边指针右移,整个过程中,需要保证取到满足条件的元祖是唯一不重复的。如果固定过的数有重复的,可以跳过,set记录固定的数。...原创 2018-09-08 10:46:52 · 159 阅读 · 0 评论 -
leetcode27:Remove Element
思路:遍历数组,设定两个指针,当快指针指向的元素不为目标值时,将快指针指向元素赋值给慢指针指向元素,同时慢指针前进一步。代码:public class RemoveElement27 { public static void main(String[] args) { int[] arr ={0,1,2,2,3,0,4,2}; System.out.println(ne...原创 2018-09-11 16:17:16 · 305 阅读 · 0 评论 -
leetcode28:Implement strStr()
思路:直接采用了暴力匹配。代码:public class ImplementstrStr28 { public static void main(String[] args) { String haystack = "", needle = ""; System.out.println(new ImplementstrStr28().strStr(haystack, n...原创 2018-09-11 17:58:15 · 272 阅读 · 0 评论 -
LeetCode16:3Sum Closest
思路:先将数组排序,固定第一个数k,然后设定两个指针i和j,i从k+1开始,j从nums.length-1开始,每次求nums[i]+nums[j]+nums[k]到target的距离,即绝对值。用一个变量保存距离,一个变量保存三个数的和,每次与之前的距离比较,如果比之前的距离小,则更新三个数的和,同时更新距离,如果nums[i]+nums[j]+nums[k]大于target,则将j左移,如...原创 2018-09-09 21:36:19 · 262 阅读 · 0 评论 -
leetcode215:Kth Largest Element in an Array
思路:参考TopK的Quick Select做法https://blog.youkuaiyun.com/Somnus_k/article/details/82724704代码:public class KthLargestElementinanArray { public static void main(String[] args) { int[] arr = { 1, 8, 35, ...原创 2018-09-16 15:55:54 · 182 阅读 · 0 评论 -
leetcode17:Letter Combinations of a Phone Number
思路:采用深度优先遍历来做,需要通过变量记录输入的数字串的位置。public class LetterCombinationsofaPhoneNumber17 { public static void main(String[] args) { String digits = "23"; System.out.println(letterCombinations(digits...原创 2018-09-10 10:00:56 · 250 阅读 · 0 评论 -
leetcode:4Sum
思路:在3Sum基础上多加一个数,先将数组排序,然后先固定两个数i,j,设定两个指针,一个从i+1开始,一个从nums.length-1开始,根据sum和target的大小情况,分别移动两个指针,并将符合的情况保存下来。时间复杂度(O(n3))。代码:public class FourSum18 { public static void main(String[] args) {...原创 2018-09-10 10:29:13 · 164 阅读 · 0 评论 -
leetcode19:Remove Nth Node From End of List
代码:public class RemoveNthNodeFromEndofList19 { public static void main(String[] args) { ListNode node1 = new ListNode(1); // node1.next=null; ListNode node2 = new ListNode(2); ListNode...原创 2018-09-10 15:29:18 · 204 阅读 · 0 评论 -
leetcode21:Merge Two Sorted Lists
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode p =l1; ListNode q = l2; ListNode head = new ListNode(-1); ListNode tmp =head; while(p!=null&&q!=null){ if(p....原创 2018-09-10 15:42:34 · 176 阅读 · 0 评论 -
leetcode20:Valid Parentheses
思路:括号匹配,每当出现右括号时,都和左边最近的进行匹配,如果能匹配,则消除,否则,则为不匹配。操作顺序符合栈的特点。代码:public class ValidParentheses20 { public static void main(String[] args) { String s = "([])[{}()(())]"; System.out.println(i...原创 2018-09-10 16:06:18 · 193 阅读 · 0 评论 -
LeetCode2: Add Two Numbers
思路:同时遍历两个链表,超过10的需要进位,如果最后一位也超过10了,需要将结果链表多扩展一位,如果链表长度不一样,需要对没遍历完的链表继续处理完。比如:2->4->95->6->4==>7->0->4->1代码:public ListNode addTwoNumbers(ListNode l1, ListNode l2...原创 2018-09-07 14:39:06 · 180 阅读 · 0 评论 -
LeetCode3. Longest Substring Without Repeating Characters
思路:设定两个指针i,index,i负责遍历,index负责记录遍历过程中无重复字符的子串的开头,如果遍历过程中子串出现了重复字符,则将index指针指向重复字符的后一位,并计算长度,与最大值max进行比较,并更新重复字符的下标。详细解答参考:https://www.cnblogs.com/StrayWolf/p/6701197.html?utm_source=itdadao&ut...原创 2018-09-07 16:33:44 · 230 阅读 · 0 评论 -
【面试题】leetcode62:Unique Paths
瓜子面试题思路:动态规划求解即可。代码:public class UniquePaths62 { public static void main(String[] args) { System.out.println(uniquePaths(7, 3)); } public static int uniquePaths(int m, int n) { int...原创 2018-09-23 15:13:02 · 250 阅读 · 0 评论 -
leetcode55:Jump Game
思路:遍历数组,并将当前位置能到达的位置全部置为true,遍历完成后后检查最后一个位置是否为true即可。代码:public static void main(String[] args) {// int num[] ={2,3,1,1,4};// int num[] ={3,2,1,0,4}; int num[] ={2,3,1,1,4}; System.out....原创 2018-09-23 15:46:22 · 224 阅读 · 0 评论 -
leetcode56:Merge Intervals
思路:典型的区间合并问题,笔试中也经常遇到,可以将区间先进行排序,然后按顺序对能合并的区间进行合并即可,需要注意的是最后一个区间,如果不能和之前的区间进行合并,最后一个区间就会被遗漏,这里的做法是添加一个辅助结尾区间,intervals.add(new Interval(Integer.MAX_VALUE, Integer.MAX_VALUE));这样最后一个有效区间就能进行处理了。cl...原创 2018-09-23 18:30:12 · 229 阅读 · 0 评论 -
LeetCode547. Friend Circles并查集
并查集介绍参考:https://juejin.im/entry/5922593d44d904006cd20175http://dongxicheng.org/structure/union-find-set/实现代码:class Solution { public int findCircleNum(int[][] num) { // 最初朋友圈的个数 int co...原创 2018-09-04 18:25:07 · 607 阅读 · 0 评论