pull/3/head
Leo 5 years ago
commit e7c5236a4e

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class01_01;
package class01;
public class Code06_BSAwesome {

@ -1,4 +1,4 @@
package class01_02;
package class02;
public class Code01_Swap {

@ -1,4 +1,4 @@
package class01_02;
package class02;
public class Code02_EvenTimesOddTimes {

@ -1,4 +1,4 @@
package class01_02;
package class02;
import java.util.HashMap;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class02_03;
package class03;
import java.util.ArrayList;
import java.util.List;

@ -1,4 +1,4 @@
package class02_03;
package class03;
public class Code02_DeleteGivenValue {

@ -1,4 +1,4 @@
package class02_03;
package class03;
import java.util.LinkedList;
import java.util.Queue;

@ -1,4 +1,4 @@
package class02_03;
package class03;
public class Code04_RingArray {

@ -1,4 +1,4 @@
package class02_03;
package class03;
import java.util.Stack;

@ -1,4 +1,4 @@
package class02_03;
package class03;
import java.util.LinkedList;
import java.util.Queue;

@ -1,4 +1,4 @@
package class02_03;
package class03;
public class Code08_GetMax {

@ -1,4 +1,4 @@
package class02_03;
package class03;
import java.util.HashMap;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class03_04;
package class04;
public class Code01_MergeSort {

@ -1,4 +1,4 @@
package class03_04;
package class04;
public class Code02_SmallSum {

@ -1,4 +1,4 @@
package class03_04;
package class04;
public class Code03_ReversePair {

@ -1,4 +1,4 @@
package class03_04;
package class04;
public class Code04_BiggerThanRightTwice {

@ -1,4 +1,4 @@
package class03_05;
package class05;
// 这道题直接在leetcode测评
// https://leetcode.com/problems/count-of-range-sum/

@ -1,4 +1,4 @@
package class03_05;
package class05;
public class Code02_PartitionAndQuickSort {

@ -1,4 +1,4 @@
package class04_06;
package class06;
import java.util.ArrayList;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class04_06;
package class06;
import java.util.Comparator;
import java.util.PriorityQueue;

@ -1,4 +1,4 @@
package class04_06;
package class06;
import java.util.Arrays;
import java.util.PriorityQueue;

@ -1,4 +1,4 @@
package class04_06;
package class06;
import java.util.Arrays;
import java.util.PriorityQueue;

@ -1,4 +1,4 @@
package class04_07;
package class07;
import java.util.Arrays;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class04_07;
package class07;
import java.util.ArrayList;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class04_07;
package class07;
import java.util.ArrayList;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class04_07;
package class07;
public class Inner<T> {
public T value;

@ -1,4 +1,4 @@
package class05_08;
package class08;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class05_08;
package class08;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class05_08;
package class08;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class05_08;
package class08;
import java.util.Arrays;

@ -1,4 +1,4 @@
package class06_09;
package class09;
import java.util.ArrayList;

@ -1,4 +1,4 @@
package class06_09;
package class09;
import java.util.Stack;

@ -1,4 +1,4 @@
package class06_09;
package class09;
public class Code03_SmallerEqualBigger {

@ -1,4 +1,4 @@
package class06_09;
package class09;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class06_10;
package class10;
public class Code01_FindFirstIntersectNode {

@ -1,6 +1,6 @@
package class07_10;
package class10;
public class Code01_RecursiveTraversalBT {
public class Code02_RecursiveTraversalBT {
public static class Node {
public int value;

@ -1,8 +1,8 @@
package class07_10;
package class10;
import java.util.Stack;
public class Code02_UnRecursiveTraversalBT {
public class Code03_UnRecursiveTraversalBT {
public static class Node {
public int value;

@ -1,4 +1,4 @@
package class07_11;
package class11;
import java.util.LinkedList;
import java.util.Queue;

@ -1,4 +1,4 @@
package class07_11;
package class11;
import java.util.LinkedList;
import java.util.Queue;

@ -1,4 +1,4 @@
package class07_11;
package class11;
import java.util.ArrayList;
import java.util.List;

@ -1,4 +1,4 @@
package class07_11;
package class11;
public class Code04_PrintBinaryTree {

@ -1,4 +1,4 @@
package class07_11;
package class11;
import java.util.HashMap;
import java.util.LinkedList;

@ -1,4 +1,4 @@
package class07_11;
package class11;
public class Code06_SuccessorNode {

@ -1,4 +1,4 @@
package class07_11;
package class11;
public class Code07_PaperFolding {

@ -1,88 +0,0 @@
package class11_17;
import java.util.ArrayList;
import java.util.List;
public class Code03_PrintAllPermutations {
public static ArrayList<String> permutation(String str) {
ArrayList<String> res = new ArrayList<>();
if (str == null || str.length() == 0) {
return res;
}
char[] chs = str.toCharArray();
process(chs, 0, res);
return res;
}
// str[0..i-1]已经做好决定的
// str[i...]都有机会来到i位置
// i终止位置str当前的样子就是一种结果 -> ans
public static void process(char[] str, int i, ArrayList<String> ans) {
if (i == str.length) {
ans.add(String.valueOf(str));
}
// 如果i没有终止i... 都可以来到i位置
for (int j = i; j < str.length; j++) { // j i后面所有的字符都有机会
swap(str, i, j);
process(str, i + 1, ans);
swap(str, i, j);
}
}
public static ArrayList<String> permutationNoRepeat(String str) {
ArrayList<String> res = new ArrayList<>();
if (str == null || str.length() == 0) {
return res;
}
char[] chs = str.toCharArray();
process2(chs, 0, res);
return res;
}
// str[0..i-1]已经做好决定的
// str[i...]都有机会来到i位置
// i终止位置str当前的样子就是一种结果 -> ans
public static void process2(char[] str, int i, ArrayList<String> res) {
if (i == str.length) {
res.add(String.valueOf(str));
return;
}
boolean[] visit = new boolean[26]; // visit[0 1 .. 25]
for (int j = i; j < str.length; j++) {
// str[j] = 'a' -> 0 visit[0] -> 'a'
// str[j] = 'z' -> 25 visit[25] -> 'z'
if (!visit[str[j] - 'a']) {
visit[str[j] - 'a'] = true;
swap(str, i, j);
process2(str, i + 1, res);
swap(str, i, j);
}
}
}
public static void swap(char[] chs, int i, int j) {
char tmp = chs[i];
chs[i] = chs[j];
chs[j] = tmp;
}
public static void main(String[] args) {
String s = "aac";
List<String> ans1 = permutation(s);
for (String str : ans1) {
System.out.println(str);
}
System.out.println("=======");
List<String> ans2 = permutationNoRepeat(s);
for (String str : ans2) {
System.out.println(str);
}
}
}

@ -1,79 +0,0 @@
package class11_17;
public class Code07_Knapsack {
public static int getMaxValue(int[] w, int[] v, int bag) {
return process(w, v, 0, 0, bag);
}
// 不变 w[] v[] bag
// index... 最大价值
// 0..index-1上做了货物的选择使得你已经达到的重量是多少alreadyW
// 如果返回-1认为没有方案
// 如果不返回-1认为返回的值是真实价值
public static int process(int[] w, int[] v, int index, int alreadyW, int bag) {
if (alreadyW > bag) {
return -1;
}
// 重量没超
if (index == w.length) {
return 0;
}
int p1 = process(w, v, index + 1, alreadyW, bag);
int p2next = process(w, v, index + 1, alreadyW + w[index], bag);
int p2 = -1;
if (p2next != -1) {
p2 = v[index] + p2next;
}
return Math.max(p1, p2);
}
public static int maxValue(int[] w, int[] v, int bag) {
return process(w, v, 0, bag);
}
// 只剩下rest的空间了
// index...货物自由选择但是剩余空间不要小于0
// 返回 index...货物能够获得的最大价值
public static int process(int[] w, int[] v, int index, int rest) {
if (rest < 0) { // base case 1
return -1;
}
// rest >=0
if (index == w.length) { // base case 2
return 0;
}
// 有货也有空间
int p1 = process(w, v, index + 1, rest);
int p2 = -1;
int p2Next = process(w, v, index + 1, rest - w[index]);
if(p2Next!=-1) {
p2 = v[index] + p2Next;
}
return Math.max(p1, p2);
}
public static int dpWay(int[] w, int[] v, int bag) {
int N = w.length;
int[][] dp = new int[N + 1][bag + 1];
for (int index = N - 1; index >= 0; index--) {
for (int rest = 1; rest <= bag; rest++) {
dp[index][rest] = dp[index + 1][rest];
if (rest >= w[index]) {
dp[index][rest] = Math.max(dp[index][rest], v[index] + dp[index + 1][rest - w[index]]);
}
}
}
return dp[0][bag];
}
public static void main(String[] args) {
int[] weights = { 3, 2, 4, 7 };
int[] values = { 5, 6, 3, 19 };
int bag = 11;
System.out.println(maxValue(weights, values, bag));
System.out.println(dpWay(weights, values, bag));
}
}

@ -1,82 +0,0 @@
package class11_17;
public class Code08_CardsInLine {
public static int win1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
return Math.max(
f(arr, 0, arr.length - 1),
s(arr, 0, arr.length - 1)
);
}
// L....R
// F S L+1..R
// L..R-1
public static int f(int[] arr, int L, int R) {
if (L == R) {
return arr[L];
}
return Math.max(
arr[L] + s(arr, L + 1, R),
arr[R] + s(arr, L, R - 1)
);
}
// arr[L..R]
public static int s(int[] arr, int L, int R) {
if (L == R) {
return 0;
}
return Math.min(
f(arr, L + 1, R), // arr[i]
f(arr, L, R - 1) // arr[j]
);
}
public static int win2(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int N = arr.length;
int[][] f = new int[N][N];
int[][] s = new int[N][N];
for(int i = 0; i < N;i++) {
f[i][i] = arr[i];
}
// s[i][i] = 0;
for(int i = 1; i < N;i++) {
int L =0;
int R =i;
while(L < N && R < N) {
f[L][R] = Math.max(
arr[L] + s[L + 1][ R],
arr[R] + s[L][R - 1]
);
s[L][R] = Math.min(
f[L + 1][R], // arr[i]
f[L][R - 1] // arr[j]
);
L++;
R++;
}
}
return Math.max(f[0][N-1], s[0][N-1]);
}
public static void main(String[] args) {
int[] arr = { 4,7,9,5,19,29,80,4 };
// A 4 9
// B 7 5
System.out.println(win1(arr));
System.out.println(win2(arr));
}
}

@ -1,4 +1,4 @@
package class08_12;
package class12;
import java.util.LinkedList;

@ -1,191 +0,0 @@
package class12;
public class Code01_RobotWalk {
public static int ways1(int N, int M, int K, int P) {
// 参数无效直接返回0
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
// 总共N个位置从M点出发还剩K步返回最终能达到P的方法数
return walk(N, M, K, P);
}
// N : 位置为1 ~ N固定参数
// cur : 当前在cur位置可变参数
// rest : 还剩res步没有走可变参数
// P : 最终目标位置是P固定参数
// 该函数的含义只能在1~N这些位置上移动当前在cur位置走完rest步之后停在P位置的方法数作为返回值返回
public static int walk(int N, int cur, int rest, int P) {
// 如果没有剩余步数了当前的cur位置就是最后的位置
// 如果最后的位置停在P上那么之前做的移动是有效的
// 如果最后的位置没在P上那么之前做的移动是无效的
if (rest == 0) {
return cur == P ? 1 : 0;
}
// 如果还有rest步要走而当前的cur位置在1位置上那么当前这步只能从1走向2
// 后续的过程就是来到2位置上还剩rest-1步要走
if (cur == 1) {
return walk(N, 2, rest - 1, P);
}
// 如果还有rest步要走而当前的cur位置在N位置上那么当前这步只能从N走向N-1
// 后续的过程就是来到N-1位置上还剩rest-1步要走
if (cur == N) {
return walk(N, N - 1, rest - 1, P);
}
// 如果还有rest步要走而当前的cur位置在中间位置上那么当前这步可以走向左也可以走向右
// 走向左之后后续的过程就是来到cur-1位置上还剩rest-1步要走
// 走向右之后后续的过程就是来到cur+1位置上还剩rest-1步要走
// 走向左、走向右是截然不同的方法,所以总方法数要都算上
return walk(N, cur + 1, rest - 1, P) + walk(N, cur - 1, rest - 1, P);
}
public static int waysCache(int N, int M, int K, int P) {
// 参数无效直接返回0
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
int[][] dp = new int[N+1][K+1];
for(int row = 0; row <= N; row++) {
for(int col = 0; col <= K; col++) {
dp[row][col] = -1;
}
}
return walkCache(N, M, K, P,dp);
}
// HashMap<String, Integer> (19,100) "19_100"
// 我想把所有cur和rest的组合返回的结果加入到缓存里
public static int walkCache(int N, int cur, int rest, int P, int[][] dp) {
if(dp[cur][rest] != -1) {
return dp[cur][rest];
}
if (rest == 0) {
dp[cur][rest] = cur == P ? 1 : 0;
return dp[cur][rest];
}
if (cur == 1) {
dp[cur][rest] = walkCache(N, 2, rest - 1, P, dp);
return dp[cur][rest];
}
if (cur == N) {
dp[cur][rest] =walkCache(N, N - 1, rest - 1, P,dp);
return dp[cur][rest];
}
dp[cur][rest] = walkCache(N, cur + 1, rest - 1, P,dp)
+ walkCache(N, cur - 1, rest - 1, P, dp);
return dp[cur][rest];
}
public static int ways2(int N, int M, int K, int P) {
// 参数无效直接返回0
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
int[][] dp = new int[K + 1][N + 1];
dp[0][P] = 1;
for (int i = 1; i <= K; i++) {
for (int j = 1; j <= N; j++) {
if (j == 1) {
dp[i][j] = dp[i - 1][2];
} else if (j == N) {
dp[i][j] = dp[i - 1][N - 1];
} else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
}
}
}
return dp[K][M];
}
public static int ways3(int N, int M, int K, int P) {
// 参数无效直接返回0
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
int[] dp = new int[N + 1];
dp[P] = 1;
for (int i = 1; i <= K; i++) {
int leftUp = dp[1];// 左上角的值
for (int j = 1; j <= N; j++) {
int tmp = dp[j];
if (j == 1) {
dp[j] = dp[j + 1];
} else if (j == N) {
dp[j] = leftUp;
} else {
dp[j] = leftUp + dp[j + 1];
}
leftUp = tmp;
}
}
return dp[M];
}
// ways4是你的方法
public static int ways4(int N, int M, int K, int P) {
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
return process(N, 0, P, M, K);
}
// 一共N个位置从M点出发一共只有K步。返回走到位置j剩余步数为i的方法数
public static int process(int N, int i, int j, int M, int K) {
if (i == K) {
return j == M ? 1 : 0;
}
if (j == 1) {
return process(N, i + 1, j + 1, M, K);
}
if (j == N) {
return process(N, i + 1, j - 1, M, K);
}
return process(N, i + 1, j + 1, M, K) + process(N, i + 1, j - 1, M, K);
}
// ways5是你的方法的dp优化
public static int ways5(int N, int M, int K, int P) {
if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) {
return 0;
}
int[][] dp = new int[K + 1][N + 1];
dp[K][M] = 1;
for (int i = K - 1; i >= 0; i--) {
for (int j = 1; j <= N; j++) {
if (j == 1) {
dp[i][j] = dp[i + 1][j + 1];
} else if (j == N) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j - 1];
}
}
}
return dp[0][P];
}
public static void main(String[] args) {
System.out.println(ways1(7, 4, 9, 5));
System.out.println(ways2(7, 4, 9, 5));
System.out.println(ways3(7, 4, 9, 5));
System.out.println(ways4(7, 4, 9, 5));
System.out.println(ways5(7, 4, 9, 5));
}
}

@ -1,4 +1,4 @@
package class08_12;
package class12;
import java.util.ArrayList;

@ -1,152 +0,0 @@
package class12;
import java.util.Arrays;
import java.util.HashMap;
public class Code02_StickersToSpellWord {
public static int minStickers1(String[] stickers, String target) {
int n = stickers.length;
int[][] map = new int[n][26];// stickers -> [26] [26] [26]
for (int i = 0; i < n; i++) {
char[] str = stickers[i].toCharArray();
for (char c : str) {
map[i][c - 'a']++;
}
}
HashMap<String, Integer> dp = new HashMap<>();
dp.put("", 0);
return process1(dp, map, target);
}
// dp 傻缓存如果t已经算过了直接返回dp中的值
// t 剩余的目标
// 0..N每一个字符串所含字符的词频统计
// 返回值是-1map 中的贴纸 怎么都无法rest
public static int process1(
HashMap<String, Integer> dp,
int[][] map,
String rest) {
if (dp.containsKey(rest)) {
return dp.get(rest);
}
// 以下就是正式的递归调用过程
int ans = Integer.MAX_VALUE; // ans -> 搞定rest使用的最少的贴纸数量
int n = map.length; // N种贴纸
int[] tmap = new int[26]; // tmap 去替代 rest
char[] target = rest.toCharArray();
for (char c : target) {
tmap[c - 'a']++;
}
for (int i = 0; i < n; i++) {
// 枚举当前第一张贴纸是谁?
if (map[i][target[0] - 'a'] == 0) {
continue;
}
StringBuilder sb = new StringBuilder();
// i 贴纸, j 枚举a~z字符
for (int j = 0; j < 26; j++) { //
if (tmap[j] > 0) { // j这个字符是target需要的
for (int k = 0; k < Math.max(0, tmap[j] - map[i][j]); k++) {
sb.append((char) ('a' + j));
}
}
}
// sb -> i
String s = sb.toString();
int tmp = process1(dp, map, s);
if (tmp != -1) {
ans = Math.min(ans, 1 + tmp);
}
}
// ans 系统最大 rest
dp.put(rest, ans == Integer.MAX_VALUE ? -1 : ans);
return dp.get(rest);
}
public static int minStickers2(String[] stickers, String target) {
int n = stickers.length;
int[][] map = new int[n][26];
for (int i = 0; i < n; i++) {
char[] str = stickers[i].toCharArray();
for (char c : str) {
map[i][c - 'a']++;
}
}
char[] str = target.toCharArray();
int[] tmap = new int[26];
for (char c : str) {
tmap[c - 'a']++;
}
HashMap<String, Integer> dp = new HashMap<>();
int ans = process2(map, 0, tmap, dp);
return ans;
}
public static int process2(int[][] map, int i, int[] tmap, HashMap<String, Integer> dp) {
StringBuilder keyBuilder = new StringBuilder();
keyBuilder.append(i + "_");
for (int asc = 0; asc < 26; asc++) {
if (tmap[asc] != 0) {
keyBuilder.append((char) (asc + 'a') + "_" + tmap[asc] + "_");
}
}
String key = keyBuilder.toString();
if (dp.containsKey(key)) {
return dp.get(key);
}
boolean finish = true;
for (int asc = 0; asc < 26; asc++) {
if (tmap[asc] != 0) {
finish = false;
break;
}
}
if (finish) {
dp.put(key, 0);
return 0;
}
if (i == map.length) {
dp.put(key, -1);
return -1;
}
int maxZhang = 0;
for (int asc = 0; asc < 26; asc++) {
if (map[i][asc] != 0 && tmap[asc] != 0) {
maxZhang = Math.max(maxZhang, (tmap[asc] / map[i][asc]) + (tmap[asc] % map[i][asc] == 0 ? 0 : 1));
}
}
int[] backup = Arrays.copyOf(tmap, tmap.length);
int min = Integer.MAX_VALUE;
int next = process2(map, i + 1, tmap, dp);
tmap = Arrays.copyOf(backup, backup.length);
if (next != -1) {
min = next;
}
for (int zhang = 1; zhang <= maxZhang; zhang++) {
for (int asc = 0; asc < 26; asc++) {
tmap[asc] = Math.max(0, tmap[asc] - (map[i][asc] * zhang));
}
next = process2(map, i + 1, tmap, dp);
tmap = Arrays.copyOf(backup, backup.length);
if (next != -1) {
min = Math.min(min, zhang + next);
}
}
int ans = min == Integer.MAX_VALUE ? -1 : min;
dp.put(key, ans);
return ans;
}
public static void main(String[] args) {
String[] arr = {"aaaa","bbaa","ccddd"};
String str = "abcccccdddddbbbaaaaa";
System.out.println(minStickers1(arr, str));
System.out.println(minStickers2(arr, str));
}
}

@ -1,4 +1,4 @@
package class08_12;
package class12;
public class Code03_IsBalanced {

@ -1,61 +0,0 @@
package class12;
public class Code04_CardsInLine {
public static int win1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
return Math.max(f(arr, 0, arr.length - 1), s(arr, 0, arr.length - 1));
}
public static int f(int[] arr, int L, int R) {
if (L == R) {
return arr[L];
}
return Math.max(arr[L] + s(arr, L + 1, R), arr[R] + s(arr, L, R - 1));
}
public static int s(int[] arr, int L, int R) {
if (L == R) {
return 0;
}
return Math.min(f(arr, L + 1, R), f(arr, L, R - 1));
}
public static int windp(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int N = arr.length;
int[][] f = new int[N][N];
int[][] s = new int[N][N];
for (int i = 0; i < N; i++) {
f[i][i] = arr[i];
}
// 0,0 右下方移动
// 0,1
// 0,2
// 0,N-1
for (int col = 1; col < N; col++) {
// 对角线出发位置(0,col)
int L = 0;
int R = col;
while (L < N && R < N) {
f[L][R] = Math.max(arr[L] + s[L + 1][R], arr[R] + s[L][R - 1]);
s[L][R] = Math.min(f[L + 1][R], f[L][R - 1]);
L++;
R++;
}
}
return Math.max(f[0][N - 1], s[0][N - 1]);
}
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 5, 8, 1, 6, 0, 3, 4, 6, 1, 7 };
System.out.println(win1(arr));
System.out.println(windp(arr));
}
}

@ -1,4 +1,4 @@
package class08_12;
package class12;
public class Code04_IsFull {

@ -1,4 +1,4 @@
package class08_12;
package class12;
import java.util.ArrayList;

@ -1,38 +0,0 @@
package class12;
public class Code05_PalindromeSubsequence {
public static int lcse(char[] str1, char[] str2) {
int[][] dp = new int[str1.length][str2.length];
dp[0][0] = str1[0] == str2[0] ? 1 : 0;
for (int i = 1; i < str1.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], str1[i] == str2[0] ? 1 : 0);
}
for (int j = 1; j < str2.length; j++) {
dp[0][j] = Math.max(dp[0][j - 1], str1[0] == str2[j] ? 1 : 0);
}
for (int i = 1; i < str1.length; i++) {
for (int j = 1; j < str2.length; j++) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
if (str1[i] == str2[j]) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);
}
}
}
return dp[str1.length - 1][str2.length - 1];
}
public static void main(String[] args) {
}
}

@ -1,4 +1,4 @@
package class08_12;
package class12;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,106 +0,0 @@
package class12;
public class Code09_CoinsWay {
// arr中都是正数且无重复值返回组成aim的方法数
public static int ways1(int[] arr, int aim) {
if (arr == null || arr.length == 0 || aim < 0) {
return 0;
}
return process1(arr, 0, aim);
}
public static int process1(int[] arr, int index, int rest) {
if(index == arr.length) {
return rest == 0 ? 1 : 0 ;
}
int ways = 0;
for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) {
ways += process1(arr, index + 1, rest - (zhang * arr[index]) );
}
return ways;
}
public static int ways2(int[] arr, int aim) {
if (arr == null || arr.length == 0 || aim < 0) {
return 0;
}
int[][] dp = new int[arr.length+1][aim+1];
// 一开始所有的过程,都没有计算呢
// dp[..][..] = -1
for(int i = 0 ; i < dp.length; i++) {
for(int j = 0 ; j < dp[0].length; j++) {
dp[i][j] = -1;
}
}
return process2(arr, 0, aim , dp);
}
// 如果index和rest的参数组合是没算过的dp[index][rest] == -1
// 如果index和rest的参数组合是算过的dp[index][rest] > - 1
public static int process2(int[] arr,
int index, int rest,
int[][] dp) {
if(dp[index][rest] != -1) {
return dp[index][rest];
}
if(index == arr.length) {
dp[index][rest] = rest == 0 ? 1 :0;
return dp[index][rest];
}
int ways = 0;
for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) {
ways += process2(arr, index + 1, rest - (zhang * arr[index]) , dp );
}
dp[index][rest] = ways;
return ways;
}
public static int ways3(int[] arr, int aim) {
if (arr == null || arr.length == 0 || aim < 0) {
return 0;
}
int N = arr.length;
int[][] dp = new int[N + 1][aim + 1];
dp[N][0] = 1;// dp[N][1...aim] = 0;
for(int index = N - 1; index >= 0; index--) {
for(int rest = 0; rest <= aim; rest++) {
int ways = 0;
for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) {
ways += dp[index + 1] [rest - (zhang * arr[index])];
}
dp[index][rest] = ways;
}
}
return dp[0][aim];
}
public static int ways4(int[] arr, int aim) {
if (arr == null || arr.length == 0 || aim < 0) {
return 0;
}
int N = arr.length;
int[][] dp = new int[N + 1][aim + 1];
dp[N][0] = 1;// dp[N][1...aim] = 0;
for(int index = N - 1; index >= 0; index--) {
for(int rest = 0; rest <= aim; rest++) {
dp[index][rest] = dp[index+1][rest];
if(rest - arr[index] >= 0) {
dp[index][rest] += dp[index][rest - arr[index]];
}
}
}
return dp[0][aim];
}
public static void main(String[] args) {
int[] arr = { 5, 10,50,100 };
int sum = 1000;
System.out.println(ways1(arr, sum));
System.out.println(ways2(arr, sum));
System.out.println(ways3(arr, sum));
System.out.println(ways4(arr, sum));
}
}

@ -1,4 +1,4 @@
package class08_13;
package class13;
import java.util.LinkedList;

@ -1,4 +1,4 @@
package class08_13;
package class13;
import java.util.ArrayList;

@ -1,4 +1,4 @@
package class08_13;
package class13;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class08_13;
package class13;
import java.util.ArrayList;
import java.util.List;

@ -1,10 +1,10 @@
package class09_13;
package class13;
import java.util.Arrays;
import java.util.Comparator;
import java.util.TreeSet;
public class Code01_LowestLexicography {
public class Code05_LowestLexicography {
public static String lowestString1(String[] strs) {
if (strs == null || strs.length == 0) {

@ -1,4 +1,4 @@
package class09_14;
package class14;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class09_14;
package class14;
import java.util.PriorityQueue;

@ -1,4 +1,4 @@
package class09_14;
package class14;
import java.util.Arrays;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class09_14;
package class14;
import java.util.Comparator;
import java.util.PriorityQueue;

@ -1,4 +1,4 @@
package class09_14;
package class14;
import java.util.HashMap;
import java.util.List;

@ -1,4 +1,4 @@
package class09_15;
package class15;
// 本题为leetcode原题
// 测试链接https://leetcode.com/problems/friend-circles/

@ -1,4 +1,4 @@
package class09_15;
package class15;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class09_15;
package class15;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.HashSet;
import java.util.LinkedList;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.HashSet;
import java.util.Stack;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.ArrayList;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.ArrayList;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.ArrayList;
import java.util.HashMap;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.Collection;
import java.util.Comparator;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.Comparator;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.HashMap;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class10_16;
package class16;
public class Edge {
public int weight;

@ -1,4 +1,4 @@
package class10_16;
package class16;
import java.util.HashMap;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class10_16;
package class16;
public class GraphGenerator {

@ -1,4 +1,4 @@
package class10_17;
package class16;
import java.util.ArrayList;

@ -1,4 +1,4 @@
package class10_17;
package class17;
import java.util.HashMap;
import java.util.HashSet;
@ -14,7 +14,7 @@ public class Code01_Dijkstra {
HashSet<Node> selectedNodes = new HashSet<>();
Node minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes);
while (minNode != null) {
// 原始点 -> minNode(跳转点) 最小距离distance
// 原始点 -> minNode(跳转点) 最小距离distance
int distance = distanceMap.get(minNode);
for (Edge edge : minNode.edges) {
Node toNode = edge.to;
@ -55,12 +55,13 @@ public class Code01_Dijkstra {
}
public static class NodeHeap {
private Node[] nodes; // 实际的堆结构
// key 某一个node value 上面堆中的位置
// 堆!
private Node[] nodes;
// node -> 堆上的什么位置?
private HashMap<Node, Integer> heapIndexMap;
// key 某一个节点, value 从源节点出发到该节点的目前最小距离
private HashMap<Node, Integer> distanceMap;
private int size; // 堆上有多少个点
private int size;
public NodeHeap(int size) {
nodes = new Node[size];
@ -76,21 +77,22 @@ public class Code01_Dijkstra {
// 有一个点叫node现在发现了一个从源节点出发到达node的距离为distance
// 判断要不要更新,如果需要的话,就更新
public void addOrUpdateOrIgnore(Node node, int distance) {
if (inHeap(node)) {
if (inHeap(node)) { // update
distanceMap.put(node, Math.min(distanceMap.get(node), distance));
insertHeapify(node, heapIndexMap.get(node));
}
if (!isEntered(node)) {
if (!isEntered(node)) { // add
nodes[size] = node;
heapIndexMap.put(node, size);
distanceMap.put(node, distance);
insertHeapify(node, size++);
}
// ignore
}
public NodeRecord pop() {
NodeRecord nodeRecord = new NodeRecord(nodes[0], distanceMap.get(nodes[0]));
swap(0, size - 1);
swap(0, size - 1); // 0 > size - 1 size - 1 > 0
heapIndexMap.put(nodes[size - 1], -1);
distanceMap.remove(nodes[size - 1]);
// free C++同学还要把原本堆顶节点析构对java同学不必

@ -1,8 +1,8 @@
package class11_17;
package class17;
import java.util.Stack;
public class Code01_Hanoi {
public class Code02_Hanoi {
public static void hanoi1(int n) {
leftToRight(n);
@ -10,7 +10,7 @@ public class Code01_Hanoi {
// 请把1~N层圆盘 从左 -> 右
public static void leftToRight(int n) {
if (n == 1) {
if (n == 1) { // base case
System.out.println("Move 1 from left to right");
return;
}
@ -76,7 +76,6 @@ public class Code01_Hanoi {
}
}
// 1~i 圆盘 目标是from -> to other是另外一个
public static void func(int N, String from, String to, String other) {
if (N == 1) { // base
System.out.println("Move 1 from " + from + " to " + to);
@ -133,8 +132,8 @@ public class Code01_Hanoi {
hanoi1(n);
System.out.println("============");
hanoi2(n);
System.out.println("============");
hanoi3(n);
// System.out.println("============");
// hanoi3(n);
}
}

@ -1,11 +1,12 @@
package class11_17;
package class17;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Code02_PrintAllSubsquences {
public class Code03_PrintAllSubsquences {
// s -> "abc" ->
public static List<String> subs(String s) {
char[] str = s.toCharArray();
String path = "";
@ -14,19 +15,21 @@ public class Code02_PrintAllSubsquences {
return ans;
}
// str固定不变
// index此时来到的位置, 要 or 不要
// 如果index来到了str中的终止位置把沿途路径所形成的答案放入ans中
// 之前做出的选择就是path
// str 固定参数
// 来到了str[index]字符index是位置
// str[0..index-1]已经走过了之前的决定都在path上
// 之前的决定已经不能改变了就是path
// str[index....]还能决定,之前已经确定,而后面还能自由选择的话,
// 把所有生成的子序列放入到ans里去
public static void process1(char[] str, int index, List<String> ans, String path) {
if (index == str.length) {
ans.add(path);
return;
}
String no = path;
process1(str, index + 1, ans, no);
String yes = path + String.valueOf(str[index]);
process1(str, index + 1, ans, yes);
// 没有要index位置的字符
process1(str, index + 1, ans, path);
// 要了index位置的字符
process1(str, index + 1, ans, path + String.valueOf(str[index]));
}
public static List<String> subsNoRepeat(String s) {
@ -41,9 +44,7 @@ public class Code02_PrintAllSubsquences {
return ans;
}
// str index set
public static void process2(char[] str, int index,
HashSet<String> set, String path) {
public static void process2(char[] str, int index, HashSet<String> set, String path) {
if (index == str.length) {
set.add(path);
return;
@ -55,7 +56,7 @@ public class Code02_PrintAllSubsquences {
}
public static void main(String[] args) {
String test = "aacc";
String test = "acccc";
List<String> ans1 = subs(test);
List<String> ans2 = subsNoRepeat(test);

@ -0,0 +1,110 @@
package class17;
import java.util.ArrayList;
import java.util.List;
public class Code04_PrintAllPermutations {
public static List<String> permutation1(String s) {
List<String> ans = new ArrayList<>();
if (s == null || s.length() == 0) {
return ans;
}
char[] str = s.toCharArray();
ArrayList<Character> rest = new ArrayList<Character>();
for (char cha : str) {
rest.add(cha);
}
String path = "";
f(rest, path, ans);
return ans;
}
public static void f(ArrayList<Character> rest, String path, List<String> ans) {
if (rest.isEmpty()) {
ans.add(path);
} else {
int N = rest.size();
for (int i = 0; i < N; i++) {
char cur = rest.get(i);
rest.remove(i);
f(rest, path + cur, ans);
rest.add(i, cur);
}
}
}
public static List<String> permutation2(String s) {
List<String> ans = new ArrayList<>();
if (s == null || s.length() == 0) {
return ans;
}
char[] str = s.toCharArray();
g1(str, 0, ans);
return ans;
}
public static void g1(char[] str, int index, List<String> ans) {
if (index == str.length) {
ans.add(String.valueOf(str));
} else {
for (int i = index; i < str.length; i++) {
swap(str, index, i);
g1(str, index + 1, ans);
swap(str, index, i);
}
}
}
public static List<String> permutation3(String s) {
List<String> ans = new ArrayList<>();
if (s == null || s.length() == 0) {
return ans;
}
char[] str = s.toCharArray();
g2(str, 0, ans);
return ans;
}
public static void g2(char[] str, int index, List<String> ans) {
if (index == str.length) {
ans.add(String.valueOf(str));
} else {
boolean[] visited = new boolean[256];
for (int i = index; i < str.length; i++) {
if (!visited[str[i]]) {
visited[str[i]] = true;
swap(str, index, i);
g2(str, index + 1, ans);
swap(str, index, i);
}
}
}
}
public static void swap(char[] chs, int i, int j) {
char tmp = chs[i];
chs[i] = chs[j];
chs[j] = tmp;
}
public static void main(String[] args) {
String s = "acc";
List<String> ans1 = permutation1(s);
for (String str : ans1) {
System.out.println(str);
}
System.out.println("=======");
List<String> ans2 = permutation2(s);
for (String str : ans2) {
System.out.println(str);
}
System.out.println("=======");
List<String> ans3 = permutation3(s);
for (String str : ans3) {
System.out.println(str);
}
}
}

@ -1,8 +1,8 @@
package class11_17;
package class17;
import java.util.Stack;
public class Code04_ReverseStackUsingRecursive {
public class Code05_ReverseStackUsingRecursive {
public static void reverse(Stack<Integer> stack) {
if (stack.isEmpty()) {
@ -13,6 +13,9 @@ public class Code04_ReverseStackUsingRecursive {
stack.push(i);
}
// 栈底元素移除掉
// 上面的元素盖下来
// 返回移除掉的栈底元素
public static int f(Stack<Integer> stack) {
int result = stack.pop();
if (stack.isEmpty()) {

@ -1,4 +1,4 @@
package class10_17;
package class17;
public class Edge {
public int weight;

@ -1,4 +1,4 @@
package class10_17;
package class17;
import java.util.HashMap;
import java.util.HashSet;

@ -1,4 +1,4 @@
package class10_16;
package class17;
import java.util.ArrayList;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save