![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
下个路口见_20
Keep coidng!Keep learning!
展开
-
leetcode50:Pow(x, n)
思路:直接用循环来做,会提示超时。我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。参考:http://www.cnblogs...原创 2018-09-23 10:02:53 · 192 阅读 · 0 评论 -
leetcode22: Generate Parentheses
思路:最终符合要求的字符串中,左括号和右括号个数都是n,而且在字符串生成过程中,左括号的剩余个数一定小于等于右括号剩余个数,如果左右括号剩余个数都为0,说明找到一个符合题意的字符串了,保存下来。所以可以采用递归,分别添加左括号和右括号,根据以上条件设置递归出口。代码:public class GenerateParentheses22 { public static void m...原创 2018-09-11 09:54:35 · 161 阅读 · 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 · 267 阅读 · 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 · 185 阅读 · 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 · 256 阅读 · 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 · 272 阅读 · 0 评论 -
leetcode66:Plus One
思路:从后往前加,记录进位即可,但需要考虑各位全为9的情况,这样高位进位,需要将数组长度增加1个位置,这种情况出现的概率比较低,所以如果高位有进位,新开一个数组将原来计算的结果保存进去即可。...原创 2018-09-23 20:29:40 · 247 阅读 · 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 · 267 阅读 · 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 · 295 阅读 · 0 评论 -
leetcode56:Merge Intervals
思路:典型的区间合并问题,笔试中也经常遇到,可以将区间先进行排序,然后按顺序对能合并的区间进行合并即可,需要注意的是最后一个区间,如果不能和之前的区间进行合并,最后一个区间就会被遗漏,这里的做法是添加一个辅助结尾区间,intervals.add(new Interval(Integer.MAX_VALUE, Integer.MAX_VALUE));这样最后一个有效区间就能进行处理了。cl...原创 2018-09-23 18:30:12 · 194 阅读 · 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 · 307 阅读 · 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 · 203 阅读 · 0 评论 -
leetcode49:Group Anagrams
思路:这道题让我们群组给定字符串集中所有的错位词,所谓的错位词就是两个字符串中字母出现的次数都一样,只是位置不同,比如abc,bac, cba等它们就互为错位词,那么我们如何判断两者是否是错位词呢,我们发现如果把错位词的字符顺序重新排列,那么会得到相同的结果,所以重新排序是判断是否互为错位词的方法,由于错位词重新排序后都会得到相同的字符串,我们以此作为key,将所有错位词都保存到map中,然后...原创 2018-09-22 19:07:17 · 195 阅读 · 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 · 392 阅读 · 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 · 200 阅读 · 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 · 199 阅读 · 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 · 236 阅读 · 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 · 240 阅读 · 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 · 217 阅读 · 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 · 173 阅读 · 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 · 1649 阅读 · 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 · 178 阅读 · 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 · 215 阅读 · 0 评论 -
【面试题&LeetCode69】求一个正数的开方
面试中遇到的是:给一个正数,包括浮点数,求它的开方,精度为0.01,二分查找的思路。实现代码:public class Sqrt { public static void main(String[] args) { int num = 2147395599; System.out.println(sqrt(num)); } private static ...原创 2018-09-05 19:59:21 · 755 阅读 · 0 评论 -
【面试题&LeetCode4】两个有序数组合并后的中位数
最简单的方法就是两个指针遍历两个数组,同时进行比较并计数,找到中位数,时间复杂度O(n)。但是,这个方法并不是面试官想要的。于是会问,还有没有更快的方法,比O(n)更快的就只能想到O(logn)了,所以采用二分查找和分治算法来解决。具体讲解参考:https://www.cnblogs.com/voidsky/p/5373982.html将求中位数为题转化为TopK问题。 实...原创 2018-09-05 18:43:33 · 1154 阅读 · 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 · 238 阅读 · 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 · 255 阅读 · 0 评论 -
LeetCode:3Sum
先用了dfs来做,结果超时了,重新考虑题目的特点。思路:可以先将数组排序,然后固定第一个数i,然后设定两个指针,一个从i+1开始,一个从num.length-1开始,判断这两个位置的数的和是否等于0-nums[i],如果大于目标值,则右边指针左移,如果小于目标值,则左边指针右移,整个过程中,需要保证取到满足条件的元祖是唯一不重复的。如果固定过的数有重复的,可以跳过,set记录固定的数。...原创 2018-09-08 10:46:52 · 132 阅读 · 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 · 185 阅读 · 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 · 148 阅读 · 0 评论 -
【面试题】求整数数组中最大和的连续子序列
题目:整数数组中最大和的连续子序列数组:[-2,1,-3,4,-1,2,1,-5,4]子序列:[4,-1,2,1]最大和:6思路:从数组下标为0的元素开始,往后求和,如果当前和<0,则将和重置为0,每次求和后,与之前和的最大值比较,取最大值。代码:public class MaxSum { public static void main(String[] args) ...原创 2018-09-01 15:54:03 · 2822 阅读 · 0 评论 -
【面试题】最大乘积子序列
题目:给一个浮点数序列,找出最大乘积的连续子序列,并找出这个子序列。这个题类似leetcode152题,只是多了一步找出子序列。手撕代码时,只是想到了用动态规划,但却没有找到递推方程。因为不一定全是正数,所以要考虑到负数负负得正的问题,递推方程为:max = Math.max(Math.max(maxtmp*num[i], mintmp*num[i]), num[i]);min ...原创 2018-09-01 15:17:05 · 338 阅读 · 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 · 189 阅读 · 0 评论 -
【面试题】两个队列实现一个栈
题目:用队列来实现栈。用两个队列来回倒腾基本就可以了,假设有两个队列A、B,初始都为空,将元素放入队列A中,如果队列B不为空,将B中的元素全部取出放入A中,这样B就为空队列了,然后下次加入元素就加入到B中,如果A不为空就把A中元素全部取出放进B中,这样A就为空队列了,就这样来回倒腾就可以了。可惜面试时候太紧张,脑子转不动,直接说不会了[汗]。代码:public class Queue...原创 2018-09-16 10:17:34 · 206 阅读 · 0 评论 -
【面试题】多区间二分查找
接上篇ip地址转整数。题目1:设计一个数据结构,里面包含ip地址的范围以及该范围内ip地址对应的城市,ip地址均采用整数形式表示。class IP2City{ String city;//如果city有id,用id也可以 Long start; Long end;}题目2:如果给你一个ip地址,快速判断它属于哪个城市,各个ip区间没有重叠的情况。当时的做法是:对n个区间对...原创 2018-09-07 12:11:02 · 546 阅读 · 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 · 167 阅读 · 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 · 154 阅读 · 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 · 174 阅读 · 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 · 139 阅读 · 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 · 186 阅读 · 0 评论