Skip to content

Commit 3c8dd10

Browse files
committed
modify code
1 parent 2c90d45 commit 3c8dd10

23 files changed

+986
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package class089;
2+
3+
import java.util.Arrays;
4+
5+
// 最大数
6+
// 给定一组非负整数nums
7+
// 重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数
8+
// 测试链接 : https://leetcode.cn/problems/largest-number/
9+
public class Code01_LargestNumber {
10+
11+
public static String largestNumber(int[] nums) {
12+
int n = nums.length;
13+
String[] arr = new String[n];
14+
for (int i = 0; i < n; i++) {
15+
arr[i] = String.valueOf(nums[i]);
16+
}
17+
Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
18+
if (arr[0].equals("0")) {
19+
return "0";
20+
}
21+
StringBuilder path = new StringBuilder();
22+
for (String s : arr) {
23+
path.append(s);
24+
}
25+
return path.toString();
26+
}
27+
28+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package class089;
2+
3+
import java.util.Arrays;
4+
5+
// 两地调度
6+
// 公司计划面试2n个人,给定一个数组 costs
7+
// 其中costs[i]=[aCosti, bCosti]
8+
// 表示第i人飞往a市的费用为aCosti,飞往b市的费用为bCosti
9+
// 返回将每个人都飞到a、b中某座城市的最低费用
10+
// 要求每个城市都有n人抵达
11+
// 测试链接 : https://leetcode.cn/problems/two-city-scheduling/
12+
public class Code02_TwoCityScheduling {
13+
14+
public static int twoCitySchedCost(int[][] costs) {
15+
int n = costs.length;
16+
int[] arr = new int[n];
17+
int sum = 0;
18+
for (int i = 0; i < n; i++) {
19+
arr[i] = costs[i][1] - costs[i][0];
20+
sum += costs[i][0];
21+
}
22+
Arrays.sort(arr);
23+
int m = n / 2;
24+
for (int i = 0; i < m; i++) {
25+
sum += arr[i];
26+
}
27+
return sum;
28+
}
29+
30+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package class089;
2+
3+
import java.util.HashMap;
4+
5+
// 吃掉N个橘子的最少天数
6+
// 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子
7+
// 1)吃掉一个橘子
8+
// 2) 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子
9+
// 3) 如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子
10+
// 每天你只能从以上 3 种方案中选择一种方案
11+
// 请你返回吃掉所有 n 个橘子的最少天数
12+
// 测试链接 : https://leetcode.cn/problems/minimum-number-of-days-to-eat-n-oranges/
13+
public class Code03_MinimumNumberEatOranges {
14+
15+
// 所有的答案都填在这个表里
16+
// 这个表对所有的过程共用
17+
public static HashMap<Integer, Integer> dp = new HashMap<>();
18+
19+
public static int minDays(int n) {
20+
if (n <= 1) {
21+
return n;
22+
}
23+
if (dp.containsKey(n)) {
24+
return dp.get(n);
25+
}
26+
// 1) 吃掉一个橘子
27+
// 2) 如果n能被2整除,吃掉一半的橘子,剩下一半
28+
// 3) 如果n能被3正数,吃掉三分之二的橘子,剩下三分之一
29+
// 因为方法2)和3),是按比例吃橘子,所以必然会非常快
30+
// 所以,决策如下:
31+
// 可能性1:为了使用2)方法,先把橘子吃成2的整数倍,然后直接干掉一半,剩下的n/2调用递归
32+
// 即,n % 2 + 1 + minDays(n/2)
33+
// 可能性2:为了使用3)方法,先把橘子吃成3的整数倍,然后直接干掉三分之二,剩下的n/3调用递归
34+
// 即,n % 3 + 1 + minDays(n/3)
35+
// 至于方法1),完全是为了这两种可能性服务的,因为能按比例吃,肯定比一个一个吃快(显而易见的贪心)
36+
int ans = Math.min(n % 2 + 1 + minDays(n / 2), n % 3 + 1 + minDays(n / 3));
37+
dp.put(n, ans);
38+
return ans;
39+
}
40+
41+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package class089;
2+
3+
import java.util.PriorityQueue;
4+
5+
// 连接棒材的最低费用
6+
// 你有一些长度为正整数的棍子
7+
// 这些长度以数组sticks的形式给出
8+
// sticks[i]是第i个木棍的长度
9+
// 你可以通过支付x+y的成本将任意两个长度为x和y的棍子连接成一个棍子
10+
// 你必须连接所有的棍子,直到剩下一个棍子
11+
// 返回以这种方式将所有给定的棍子连接成一个棍子的最小成本
12+
// 测试链接 : https://leetcode.cn/problems/minimum-cost-to-connect-sticks/
13+
public class Code04_MinimumCostToConnectSticks {
14+
15+
public static int connectSticks(int[] arr) {
16+
PriorityQueue<Integer> pQ = new PriorityQueue<>();
17+
for (int i = 0; i < arr.length; i++) {
18+
pQ.add(arr[i]);
19+
}
20+
int sum = 0;
21+
int cur = 0;
22+
while (pQ.size() > 1) {
23+
cur = pQ.poll() + pQ.poll();
24+
sum += cur;
25+
pQ.add(cur);
26+
}
27+
return sum;
28+
}
29+
30+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package class089;
2+
3+
// 过河问题
4+
// 有一个大晴天,Oliver与同学们一共N人出游
5+
// 他们走到一条河的东岸边,想要过河到西岸
6+
// 而东岸边有一条小船,船太小了,一次只能乘坐两人
7+
// 每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间
8+
// 现在已知N个人的渡河时间T,Oliver 想要你告诉他,他们最少要花费多少时间,才能使所有人都过河
9+
// 注意,只有船在东岸(西岸)的人才能坐上船划到对岸
10+
// 测试链接 : https://www.luogu.com.cn/problem/P1809
11+
// 请同学们务必参考如下代码中关于输入、输出的处理
12+
// 这是输入输出处理效率很高的写法
13+
// 提交以下的code,提交时请把类名改成"Main",可以直接通过
14+
15+
import java.io.BufferedReader;
16+
import java.io.IOException;
17+
import java.io.InputStreamReader;
18+
import java.io.OutputStreamWriter;
19+
import java.io.PrintWriter;
20+
import java.io.StreamTokenizer;
21+
import java.util.Arrays;
22+
23+
public class Code05_CrossRiver {
24+
25+
public static int MAXN = 100001;
26+
27+
public static int[] arr = new int[MAXN];
28+
29+
public static int[] dp = new int[MAXN];
30+
31+
public static int n;
32+
33+
public static void main(String[] args) throws IOException {
34+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
35+
StreamTokenizer in = new StreamTokenizer(br);
36+
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
37+
while (in.nextToken() != StreamTokenizer.TT_EOF) {
38+
n = (int) in.nval;
39+
for (int i = 0; i < n; i++) {
40+
in.nextToken();
41+
arr[i] = (int) in.nval;
42+
}
43+
int ans = minCost();
44+
out.println(ans);
45+
out.flush();
46+
}
47+
48+
}
49+
50+
public static int minCost() {
51+
Arrays.sort(arr, 0, n);
52+
if (n >= 1) {
53+
dp[0] = arr[0];
54+
}
55+
if (n >= 2) {
56+
dp[1] = arr[1];
57+
}
58+
if (n >= 3) {
59+
dp[2] = arr[0] + arr[1] + arr[2];
60+
}
61+
for (int i = 3; i < n; i++) {
62+
dp[i] = Math.min(dp[i - 2] + arr[1] + arr[0] + arr[i] + arr[1], dp[i - 1] + arr[i] + arr[0]);
63+
}
64+
return dp[n - 1];
65+
}
66+
67+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package class089;
2+
3+
// 跳跃游戏II
4+
// 给定一个长度为n的0索引整数数组nums,初始位置为nums[0]
5+
// 每个元素nums[i]表示从索引i向前跳转的最大长度
6+
// 换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处
7+
// 0 <= j <= nums[i]
8+
// i + j < n
9+
// 返回到达nums[n - 1]的最小跳跃次数
10+
// 生成的测试用例可以到达nums[n-1]
11+
// 测试链接 : https://leetcode.cn/problems/jump-game-ii/
12+
public class Code06_JumpGameII {
13+
14+
public static int jump(int[] arr) {
15+
if (arr == null || arr.length == 0) {
16+
return 0;
17+
}
18+
int step = 0;
19+
int cur = 0;
20+
int next = 0;
21+
for (int i = 0; i < arr.length; i++) {
22+
if (cur < i) {
23+
step++;
24+
cur = next;
25+
}
26+
next = Math.max(next, i + arr[i]);
27+
}
28+
return step;
29+
}
30+
31+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package class090;
2+
3+
// 砍竹子II
4+
// 现需要将一根长为正整数bamboo_len的竹子砍为若干段
5+
// 每段长度均为正整数
6+
// 请返回每段竹子长度的最大乘积是多少
7+
// 答案需要对1000000007取模
8+
// 测试链接 : https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/
9+
public class Code01_CuttingBamboo {
10+
11+
public static int mod = 1000000007;
12+
13+
public static long power(long x, int n) {
14+
long ans = 1;
15+
while (n > 0) {
16+
if ((n & 1) == 1) {
17+
ans = (ans * x) % mod;
18+
}
19+
x = (x * x) % mod;
20+
n >>= 1;
21+
}
22+
return ans;
23+
}
24+
25+
public static int cuttingBamboo(int n) {
26+
if (n == 2) {
27+
return 1;
28+
}
29+
if (n == 3) {
30+
return 2;
31+
}
32+
int rest = n % 3 == 0 ? n : (n % 3 == 1 ? (n - 4) : (n - 2));
33+
int last = n % 3 == 0 ? 1 : (n % 3 == 1 ? 4 : 2);
34+
return (int) ((power(3, rest / 3) * last) % mod);
35+
}
36+
37+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package class091;
2+
3+
import java.util.Arrays;
4+
5+
// 会议必须独占时间段的最大会议数量
6+
// 给定若干会议的开始、结束时间
7+
// 你参加某个会议的期间,不能参加其他会议
8+
// 返回你能参加的最大会议数量
9+
// 没有在线测试,对数器验证
10+
public class Code01_MeetingMonopoly {
11+
12+
// 暴力方法
13+
// 为了验证
14+
// 时间复杂度O(n!)
15+
public static int maxMeeting1(int[][] meeting) {
16+
return f(meeting, meeting.length, 0);
17+
}
18+
19+
// 把所有会议全排列
20+
// 其中一定有安排会议次数最多的排列
21+
public static int f(int[][] meeting, int n, int i) {
22+
int ans = 0;
23+
if (i == n) {
24+
for (int j = 0, time = -1; j < n; j++) {
25+
if (time <= meeting[j][0]) {
26+
ans++;
27+
time = meeting[j][1];
28+
}
29+
}
30+
} else {
31+
for (int j = i; j < n; j++) {
32+
swap(meeting, i, j);
33+
ans = Math.max(ans, f(meeting, n, i + 1));
34+
swap(meeting, i, j);
35+
}
36+
}
37+
return ans;
38+
}
39+
40+
public static void swap(int[][] meeting, int i, int j) {
41+
int[] tmp = meeting[i];
42+
meeting[i] = meeting[j];
43+
meeting[j] = tmp;
44+
}
45+
46+
// 正式方法
47+
// 时间复杂度O(n*logn)
48+
public static int maxMeeting2(int[][] meeting) {
49+
Arrays.sort(meeting, (a, b) -> a[1] - b[1]);
50+
int n = meeting.length;
51+
int ans = 0;
52+
for (int i = 0, cur = -1; i < n; i++) {
53+
if (cur <= meeting[i][0]) {
54+
ans++;
55+
cur = meeting[i][1];
56+
}
57+
}
58+
return ans;
59+
}
60+
61+
// 为了验证
62+
// 生成随机会议
63+
public static int[][] randomMeeting(int n, int m) {
64+
int[][] ans = new int[n][2];
65+
for (int i = 0, a, b; i < n; i++) {
66+
a = (int) (Math.random() * m);
67+
b = (int) (Math.random() * m);
68+
if (a == b) {
69+
ans[i][0] = a;
70+
ans[i][1] = a + 1;
71+
} else {
72+
ans[i][0] = Math.min(a, b);
73+
ans[i][1] = Math.max(a, b);
74+
}
75+
}
76+
return ans;
77+
}
78+
79+
// 对数器
80+
// 为了验证
81+
public static void main(String[] args) {
82+
int N = 10;
83+
int M = 12;
84+
int testTimes = 2000;
85+
System.out.println("测试开始");
86+
for (int i = 1; i <= testTimes; i++) {
87+
int n = (int) (Math.random() * N) + 1;
88+
int[][] meeting = randomMeeting(n, M);
89+
int ans1 = maxMeeting1(meeting);
90+
int ans2 = maxMeeting2(meeting);
91+
if (ans1 != ans2) {
92+
// 如果出错了
93+
// 可以增加打印行为找到一组出错的例子
94+
// 然后去debug
95+
System.out.println("出错了!");
96+
}
97+
if (i % 100 == 0) {
98+
System.out.println("测试到第" + i + "组");
99+
}
100+
}
101+
System.out.println("测试结束");
102+
}
103+
104+
}

0 commit comments

Comments
 (0)