提交 e8d1b352 编写于 作者: L liu13

20190308

上级 b8d2f7ed
......@@ -13,7 +13,7 @@ public class lc14 {
}
public static String longestCommonPrefix(String[] strs) {
public static String longestCommonPrefix(String[] strs) { //不是最优的方法,多做了比较
if(strs.length==0)
return "";
Arrays.sort(strs);
......
......@@ -36,4 +36,19 @@ public class lc20 {
return true;
return false;
}
public boolean isValid2(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
}
......@@ -11,6 +11,7 @@ import java.util.PriorityQueue;
* 分类:Linked List, Divide and Conquer, Heap
* 思路:优先队列或分治方法
* 注意:优先队列如何定义比较方法
* lc378, lc264
*/
public class lc23 {
public class ListNode {
......
package code;
/*
* 263. Ugly Number
* 题意:因子只包含2,3,5的数称为丑数
* 难度:Easy
* 分类:Math
* 思路:
* Tips:
*/
public class lc263 {
public boolean isUgly(int num) {
if(num==0) return false;
if(num==1) return true;
while(num%2==0) num/=2;
while(num%3==0) num/=3;
while(num%5==0) num/=5;
return num==1;
}
}
package code;
import java.util.PriorityQueue;
/*
* 264. Ugly Number II
* 题意:因子只包含2,3,5的数称为丑数,求第n个丑数
* 难度:Medium
* 分类:Math, Heap, Dynamic Programming
* 思路:丑数乘以2,3,或5还是丑数
* Tips:注意可能存在重复的数字,和溢出
* lc23, lc378
*/
public class lc264 {
public int nthUglyNumber(int n) {
PriorityQueue<Long> pr = new PriorityQueue<>(); //用Long,防止溢出
pr.add(1L);
long res = 0;
while(n>0){
res = pr.remove();
while(pr.size()>0 &&pr.peek()==res ) pr.remove(); //注意可能存在重复的数字
pr.add(res*2);
pr.add(res*3);
pr.add(res*5);
n--;
}
return (int)res;
}
}
......@@ -16,7 +16,7 @@ public class lc279 {
public static int numSquares(int n) {
int[] dp = new int[n];
Arrays.fill(dp,Integer.MAX_VALUE);
for (int i = 1; i <= n ; i++) {
for (int i = 1; i <= n ; i++) { //两个for循环
for (int j=1; j<=i ; j++) {
if(j*j==i)
dp[i-1] = 1;
......
......@@ -5,6 +5,7 @@ package code;
* 难度:Hard
* 分类:Array, Binary Search, Divide and Conquer
* 注意:两个数组长度可能不一样;边际问题
* 复杂度是 O(log(min(m,n)) ,在短的数组上二分查找即可
*/
public class lc4 {
public static void main(String[] args) {
......
......@@ -16,7 +16,7 @@ public class lc416 {
int[] nums = {1, 2, 5};
System.out.println(canPartition(nums));
}
public static boolean canPartition(int[] nums) {
public static boolean canPartition(int[] nums) { //自己写的不知道什么,回头看已经看不懂自己的代码了。。。
int sum = 0;
for (int i : nums) {
sum+=i;
......@@ -39,4 +39,31 @@ public class lc416 {
}
return false;
}
public boolean canPartition2(int[] nums) {
// check edge case
if (nums == null || nums.length == 0) {
return true;
}
// preprocess
int volumn = 0;
for (int num : nums) {
volumn += num;
}
if (volumn % 2 != 0) {
return false;
}
volumn /= 2;
// dp def
boolean[] dp = new boolean[volumn + 1];
// dp init
dp[0] = true;
// dp transition
for (int i = 1; i <= nums.length; i++) {
for (int j = volumn; j >= nums[i-1]; j--) { //从后往前更新,压缩空间
dp[j] = dp[j] || dp[j - nums[i-1]];
}
}
return dp[volumn];
}
}
......@@ -6,7 +6,7 @@ package code;
* 分类:Math, Dynamic Programming, Minimax
* 思路:之前做过有印象,先拿的人一定赢的。
* dp的思路需要借鉴一下的, dp[i][j] 表示数组 i~j 的最优解
* 向两边拓展的dp, 用一个变量表示 size 这个dp。想想一下三角形的区域是怎么一步步被填满的
* 向两边拓展的dp, 用一个变量表示 size 这个dp。想想一下三角形的区域是怎么一步步被填满的,斜线斜线的,最后是一个点
* 拿了piles[i], 则dp[i+1][j]就被另一个人拿了,结果是 piles[i] - dp[i + 1][j]
* 拿了piles[j], 则dp[i][j-1]就被另一个人拿了,结果是 piles[j] - dp[i][j - 1]
* Tips:
......
......@@ -5,7 +5,7 @@ LeetCode 指南
- 说明: 每道题在代码头部都添加了我的解题思路和批注,Eg:
/*
/*****
* 287. Find the Duplicate Number
* 题意:n+1个数属于[1~n],找出重复的那个数
* 难度:Medium
......@@ -149,6 +149,8 @@ LeetCode 指南
| 239 [Java](./code/lc239.java)
| 240 [Java](./code/lc240.java)
| 242 [Java](./code/lc242.java)
| 263 [Java](./code/lc263.java)
| 264 [Java](./code/lc264.java)
| 268 [Java](./code/lc268.java)
| 279 [Java](./code/lc279.java)
| 283 [Java](./code/lc283.java)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册