自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 收藏
  • 关注

原创 538. Convert BST to Greater Tree

利用树遍历的有序性:中序遍历。当然,递归和非递归的想法总是合理的。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x...

2019-01-18 16:25:03 204

原创 239. Sliding Window Maximum

最先想到的办法是每个窗中都求最大值,唯一的技巧是保存上一个最大值的位置pos,如果pos出了窗,则遍历当前窗求最值,否则,只需比较窗右边的值和最大值即可。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0 || nums == n...

2019-01-03 21:41:20 193

原创 128. Longest Consecutive Sequence

排序法就不说了。首先,将数组的元素放入set中,一是去重,二是可以在o(1)的时间内访问。选区nums中的元素n,判断 n+1,n+2...是否在set中,如果在,则更新连续子序列的长度,如果不在,换下一个元素。注意,为了避免重复,我们总是选区满足n-1不在set中这一条件下的n作为序列的开头。(如遍历过2,3,4,就不用再遍历3,4)。class Solution { publ...

2018-12-28 21:34:15 224

原创 5. Longest Palindromic Substring&&647. Palindromic Substrings

 诚然,不言暴力法。动态规划和中心扩展法较为合适。 class Solution {public String longestPalindrome(String s) { int n = s.length(); String res = ""; boolean[][] dp = new boolean[n][n]; for (int i =n; ...

2018-12-27 20:20:27 158

原创 621. Task Scheduler

这是任务调度问题,需要满足的条件是相同任务之间的间隔为n,求最小的完成任务的总时间。 大概思路呢,就是,首先统计出每个字母出现的频率,保存到count数组中,之后排序,从小到大升序排序,也就是数组中的最后一个频率是出现次数最多的频率,最大频率,也就是count[25]。我们要做的是在出现频率最多的那个字母比如A,中间插空,相邻的两个A中间需要插入(n-1)个字母(也包括 待命 命令),...

2018-12-25 15:10:59 178

原创 124. Binary Tree Maximum Path Sum

对于每一节点,考虑从其左/右子树中的一点到这一个节点的路径所能形成的最大值。Math.max(left.val, right.val) + root.val,是经过这个节点为止的能形成的最大值的一条支路。/** * Definition for a binary tree node. * public class TreeNode { * int val; * T...

2018-12-24 20:31:16 146 1

原创 617. Merge Two Binary Trees

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { p...

2018-12-23 17:50:07 154

原创 560. Subarray Sum Equals K

最容易想到的是暴力法,依次算出每个连续子数组的和,与k比较:class Solution { public int subarraySum(int[] nums, int k) { int count=0; for(int i=0;i<nums.length;i++){ int sum=0; f...

2018-12-23 17:15:23 185

原创 572. Subtree of Another Tree

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solutio...

2018-12-21 17:39:14 131

原创 494. Target Sum

 题目意思很明确,最简单的是暴力法,对于每个元素nums[i],考虑+nums[i]和-nums[i]两种情况:public class Solution { int count = 0; public int findTargetSumWays(int[] nums, int S) { calculate(nums, 0, 0, S); ...

2018-12-21 17:17:34 143

原创 438. Find All Anagrams in a String

最简单的办法是比较s中每一个长度与p相同的字串与p是否一样。class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> re=new ArrayList<>(); if(s.length()<p...

2018-12-19 21:27:08 109

原创 543. Diameter of Binary Tree

对于任意节点node,可以计算其左子树的深度left和右子树的深度right,left+right+1即为过node的最长距离。遍历树的节点,取最大值即可:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre...

2018-12-13 10:50:43 149

原创 416. Partition Equal Subset Sum

题目就是要从数组中找一个序列,使他们的和为sum/2。如果暴力硬解,挑选的数组子序列个数不定,复杂度太高,肯定不可取。事实上这是一个01背包问题,对于每个数字,要么选中要么不选中。具体的,用一个二维数组d[i][j]表示,从前i个元素中挑选子序列是否可以计算出和j。那么我们只要知道当j=sum/2的时候,d[i][j]是否为true。d[i][j]结果的得出,可以有两种情况1.d[...

2018-12-12 15:46:12 233

原创 394. Decode String

public class Solution { public String decodeString(String s) { String res = ""; Stack<Integer> countStack = new Stack<>(); Stack<String> resStack = new...

2018-12-11 21:06:03 124

原创 347. Top K Frequent Elements

【分析】  step1.显然,为了找出数组中出现频次最多的前k个元素,首先,我们需要分别统计出数组中各个元素出现的频次,很容易想到哈希表,Java中提供了HashMap类,它实现了Map接口,HashMap是一个泛型类(HashMap<key,value>),可以用来存储键/值对,为了统计数组个元素的频次,我们可以把元素数值作为“键”,对应元素出现的次数作为“值”,如此,我们只需...

2018-12-11 19:14:34 182

原创 338. Counting Bits

首先声明,我只会最简单的做法,逐位判断。(手动惭愧)我们主要学习一下下面的大神算法,简直都是人才。public int[] countBits(int num) { int[] f = new int[num + 1]; for (int i=1; i<=num; i++) f[i] = f[i >> 1] + (i & 1);...

2018-12-08 21:00:25 150

原创 322. Coin Change

最直观的是暴力法,遍历coins,每一个面额的最大数目xi=amount\si,遍历每一种可能,找出数目最少的那一种。class Solution { public int coinChange(int[] coins, int amount) { return coinChange(0, coins, amount); } privat...

2018-12-08 20:25:11 186

原创 112. Path Sum&&113. Path Sum II&&437. Path Sum III

 如果从根节点开始找,每次sum减掉val则到了叶子节点的时候,sum肯定等于叶子节点的值。否则,就没有这么一条路径。朴素深搜,好装逼的词!!/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode r...

2018-12-06 15:33:33 156

原创 309. Best Time to Buy and Sell Stock with Cooldown

首先申明一下,这个思路并不是我想出来的,只是在LeetCode上看到有人这样解,觉得这个思路很不错,所以写下来作为分享和记录。 1.方法1从题目中可以看出,不管哪一天,都只能是 buy 或者 sell 或者 cooldown(rest) 三种状态中的一种,而根据题目的约束条件,我们可以画出下图所示的状态图:                  由此图我们可以得到:s0[i] = m...

2018-12-04 20:21:03 250

原创 62. Unique Paths&&63. Unique Paths II

 动态规划轻松解决:grid[i][j]为到达(i,j)处的方案数,则:grid[i][j]=grid[i-1][j]+grid[i][j-1].。public class Solution {public int uniquePaths(int m, int n) { int[][] grid = new int[m][n]; for(int i = 0; i&l...

2018-12-03 21:30:52 121

原创 300. Longest Increasing Subsequence

暴力法:采用递归,如果当前元素大于pre,则序列中包含当前元素,长度加1,如果小于等于pre,考虑下一个元素,结果返回两种情况的最大值。public class Solution { public int lengthOfLIS(int[] nums) { return lengthofLIS(nums, Integer.MIN_VALUE, 0); ...

2018-12-03 20:41:53 127

原创 461. Hamming Distance

将xy求异或,统计结果中位数为1的个数。1.判断n最低位是否为1,然后右移一位。2.n&(n-1)可以实现将n的最低位的1变成0。 class Solution { public int hammingDistance(int x, int y) { int out = x ^ y; int count = 0; ...

2018-11-30 22:00:07 109

原创 287. Find the Duplicate Number

方法一:应用鸽笼原理进行二分法查找因为在1~n的范围内最多只能放n个不同的数字,但现在数组放了n+1个数字,所以至少有一个重复。对于在1~n范围内的某个数字m,那么数组中小于等于m的数字最少有m个,并且刚好为m的时候,1~m之间不会有重复,比m大时,重复数字必在1~m中。public class Solution { public int findDuplicate(in...

2018-11-30 20:22:09 163

原创 279. Perfect Squares

任意一个数x,都能表示为 x = a + b*b(即使x本身就是个完全平方数),因此求解x的最少完全平方数缩小为求解a的最少完全平方数,即求“最优子结构”,典型的动态规划思想。dp[i]表示i的最小完全平方因子个数,且dp[i]=min{dp[i],dp[i-1]+1,dp[i-4]+1,dp[i-9]+1....dp[1]+1}. 那么,对于数组中的i,有如下可能:1.如果 i=0,...

2018-11-29 18:13:29 145

原创 148. Sort List

采用归并排序,先将链表一分为二,对两部分进行排序,之后再合并两个排好序的链表。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */pub...

2018-11-29 11:22:06 106

原创 快速排序的java实现

快排原理:        在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。        整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。        一趟排序的方法:1,定义i=0,j=A.lenght-1,i为第...

2018-11-28 23:19:13 82

原创 Java排序之归并排序

1. 简介归并排序的算法是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则成为二路合并。对于一个原始的待排序数列,往往可以通过分割的方法来归结为多路合并排序。2. 归并排序思路将长度为n的待排序数组看做是由n个有序长度为1的数组组成将其两两合并,得到长度为2的有序数组然后再对这些子表进行合并,得到长度为4的有序数组重复上述过程,一直到最后的子表长度为n也就完成了...

2018-11-28 22:33:59 79

原创 141. Linked List Cycle&&142. Linked List Cycle II

解法思想:算法思想就是设置一个快指针fp和一个慢指针sp,两个指针起始同时指向head节点,其中快指针每次走两步,慢指针每次走一步,那么如果链表有环的话他们一定能够相遇。可以想象两个人同时从操场上起跑,其中甲的速度是乙速度的2倍,那么当乙跑完一圈的时候甲也跑了两圈,他们一定能够相遇。/** * Definition for singly-linked list. * class L...

2018-11-26 16:59:14 85

原创 139. Word Break

采用动态规划,dp[i]表示substring(0,i+1)是否可以分解,i每增加1,如果存在0<=j<i,满足substring(i,j+1)可以分解,substring(j,n)存在,则dp[i+1]为true。 class Solution { public boolean wordBreak(String s, List<String> wordD...

2018-11-26 15:18:12 87

原创 114. Flatten Binary Tree to Linked List

 基本的操作为pre=root.left,root.left=null,pre.right=root.right,root.right=pre.所以递归顺序为:flatten(root.right),flatten(root.left),然后改变root.right,使其等于pre。/** * Definition for a binary tree node. * public...

2018-11-24 17:16:14 104

原创 221. Maximal Square

 暴力法就不说了,直接讲用动态规划,设dp[i][j]为右下方节点为index[i][j]的最大方块的边长,则:1.i=0,dp[0][j]=index[0][j];2.j=0,dp[i][0]=index[i]][0];3.if index[i][j]=0,dp[i][j]=0,else: dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1][j-...

2018-11-22 16:40:59 101

原创 235. Lowest Common Ancestor of a Binary Search Tree&&236. Lowest Common Ancestor of a Binary Tree

我开始想到的方法是从root开始find,先找到p,保存路径,然后沿路径(往回)节点开始,依次find节点q,找到的话,该节点就是最低的公共祖先。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode...

2018-11-21 16:49:08 163

原创 241. Different Ways to Add Parentheses

运算符将字符串分成了运算符左边和右边两部分,而每部分是原问题更小的子问题。每部分会产生一个运算结果集合,最终运算结果由左右两部分结果集合通过中间的运算符计算得到。class Solution { public List<Integer> diffWaysToCompute(String input) { List<Integer> ret ...

2018-11-19 15:58:07 111

原创 238. Product of Array Except Self

用两个数组left和right,left[i]=nums[0]*nums[1]...nums[i-1],right[i]=nums[i+1]*nums[i+2]...*nums[len-1],最终,res[i]=left[i]*right[i]。class Solution { public int[] productExceptSelf(int[] nums) { ...

2018-11-18 20:26:45 81

原创 227. Basic Calculator II

public class Solution {public int calculate(String s) { int len; if(s==null || (len = s.length())==0) return 0; Stack<Integer> stack = new Stack<Integer>(); int num = 0...

2018-11-16 16:32:48 174

原创 232. Implement Queue using Stacks

用两个栈。 class MyQueue { Stack<Integer> s1,s2; /** Initialize your data structure here. */ public MyQueue() { s1 = new Stack<Integer>(); s2 = new Stack<In...

2018-11-13 20:26:17 115

原创 225. Implement Stack using Queues

 class MyStack { Queue<Integer> q; /** Initialize your data structure here. */ public MyStack() { q = new LinkedList<>(); } /** Push element x ont...

2018-11-13 20:11:24 134

原创 224. Basic Calculator

 class Solution { public int calculate(String s) { int len = s.length(), sign = 1, result = 0; Stack<Integer> stack = new Stack<Integer>(); for (int i = 0; i < len; i++) ...

2018-11-13 19:17:47 100

原创 222. Count Complete Tree Nodes

常规思路是遍历树。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class So...

2018-11-12 20:06:28 125

原创 349. Intersection of Two Arrays&&350. Intersection of Two Arrays II

用两个 hash sets(Time complexity: O(n))public class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Set<Intege...

2018-11-09 16:51:07 137

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除