Skip to content

Commit 2dd0130

Browse files
committed
新增3题,累积48题
1 parent d77d7af commit 2dd0130

File tree

3 files changed

+202
-0
lines changed

3 files changed

+202
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.cjl.leetcode;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
/*
8+
16. 最接近的三数之和
9+
问题描述:
10+
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
11+
返回这三个数的和。
12+
假定每组输入只存在恰好一个解。
13+
示例 1:
14+
输入:nums = [-1,2,1,-4], target = 1
15+
输出:2
16+
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
17+
示例 2:
18+
输入:nums = [0,0,0], target = 1
19+
输出:0
20+
提示:
21+
3 <= nums.length <= 1000
22+
-1000 <= nums[i] <= 1000
23+
-10^4 <= target <= 10^4
24+
25+
*/
26+
public class Question_16 {
27+
28+
// 时间复杂度是O(N^2),空间复杂度是O(1)
29+
public int solution1(int[] nums, int target) {
30+
int res = Integer.MAX_VALUE;
31+
int len = nums.length;
32+
Arrays.sort(nums);
33+
for (int i = 0; i < len; i++) {
34+
int left = i + 1;
35+
int right = len - 1;
36+
while(left < right) {
37+
int sum = nums[i] + nums[left++] + nums[right--];
38+
if (Math.abs(target - sum) < Math.abs(target - res)) {
39+
res = sum;
40+
}
41+
if (sum < target) {
42+
left++;
43+
}else if (sum > target) {
44+
right--;
45+
} else {
46+
return res;
47+
}
48+
}
49+
}
50+
return res;
51+
}
52+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.cjl.leetcode;
2+
3+
4+
import java.util.Arrays;
5+
6+
/*
7+
322. 零钱兑换
8+
问题描述:
9+
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
10+
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
11+
你可以认为每种硬币的数量是无限的。
12+
示例 1:
13+
输入:coins = [1, 2, 5], amount = 11
14+
输出:3
15+
解释:11 = 5 + 5 + 1
16+
示例 2:
17+
输入:coins = [2], amount = 3
18+
输出:-1
19+
示例 3:
20+
输入:coins = [1], amount = 0
21+
输出:0
22+
提示:
23+
1 <= coins.length <= 12
24+
1 <= coins[i] <= 2^31 - 1
25+
0 <= amount <= 10^4
26+
27+
*/
28+
public class Question_322 {
29+
30+
// 动态数组
31+
// 时间复杂度是O(N),空间复杂度是O(N)
32+
public int solution1(int[] coins, int amount) {
33+
// 该数组下标代表金额,值则代表凑成该金额的最少硬币数量
34+
int[] dp = new int[amount + 1];
35+
dp[0] = 0;
36+
Arrays.fill(dp, 1, amount + 1,Integer.MAX_VALUE);
37+
for (int coin : coins) {
38+
// 对于每个硬币面额 coin,从 coin 到 amount 的范围内,更新dp数组
39+
for (int i = coin; i <= amount; i++) {
40+
// 若dp[i-coin]不等于初始值,则表示可以使用该硬币
41+
if (dp[i - coin] != Integer.MAX_VALUE) {
42+
// 这里的 dp[i-coin]+1 代表 i-coin 面额的硬币最少数量,再加上一个 coin 硬币面额的硬币
43+
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
44+
}
45+
}
46+
}
47+
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
48+
}
49+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.cjl.leetcode;
2+
3+
import java.util.*;
4+
5+
/*
6+
468. 验证IP地址
7+
问题描述:
8+
给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
9+
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如:
10+
“192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “[email protected]” 为无效IPv4地址。
11+
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:
12+
1 <= xi.length <= 4
13+
xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
14+
在 xi 中允许前导零。
15+
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,
16+
而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。
17+
示例 1:
18+
输入:queryIP = "172.16.254.1"
19+
输出:"IPv4"
20+
解释:有效的 IPv4 地址,返回 "IPv4"
21+
示例 2:
22+
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
23+
输出:"IPv6"
24+
解释:有效的 IPv6 地址,返回 "IPv6"
25+
示例 3:
26+
输入:queryIP = "256.256.256.256"
27+
输出:"Neither"
28+
解释:既不是 IPv4 地址,又不是 IPv6 地址
29+
提示:
30+
queryIP 仅由英文字母,数字,字符 '.' 和 ':' 组成。
31+
*/
32+
public class Question_468 {
33+
34+
// 遍历对比解法
35+
// 时间复杂度是O(N),空间复杂度是O(1)
36+
public String solution1(String queryIP){
37+
if (queryIP.contains(".") && isIPv4(queryIP)) return "IPv4";
38+
if (queryIP.contains(":") && isIPv6(queryIP)) return "IPv6";
39+
return "Neither";
40+
}
41+
42+
// 正则解法
43+
public String solution2(String queryIP) {
44+
String result = "Neither";
45+
if (queryIP == null) {
46+
return result;
47+
}
48+
String regex0 = "(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)";
49+
String regexIPv4 = regex0 + "(\\." + regex0 + "){3}";
50+
String regex1 = "([\\da-fA-F]{1,4})";
51+
String regexIPv6 = regex1 + "(:" + regex1 + "){7}";
52+
53+
if (queryIP.matches(regexIPv4)) {
54+
result = "IPv4";
55+
} else if(queryIP.matches(regexIPv6)) {
56+
result = "IPv6";
57+
}
58+
return result;
59+
}
60+
61+
public boolean isIPv4(String s) {
62+
String[] strs = s.split("\\.",-1);
63+
if (strs.length != 4) {
64+
return false;
65+
}
66+
for (int i = 0; i < 4; i++) {
67+
if (strs[i].length() == 0 || (strs[i].length() > 1 && strs[i].charAt(0) == '0')) {
68+
return false;
69+
}
70+
try {
71+
int tmpNum = Integer.parseInt(strs[i]);
72+
if (tmpNum > 255) {
73+
return false;
74+
}
75+
} catch (Exception e) {
76+
return false;
77+
}
78+
}
79+
return true;
80+
}
81+
82+
public boolean isIPv6(String s) {
83+
String[] strs = s.split(":",-1);
84+
if (strs.length != 8) {
85+
return false;
86+
}
87+
for (int i = 0; i < 8; i++) {
88+
if (strs[i].length() == 0 || strs[i].length() > 4) {
89+
return false;
90+
}
91+
for (int j = 0; j < strs[i].length(); j++) {
92+
if (!(strs[i].charAt(j) >= '0' && strs[i].charAt(j) < '9') &&
93+
!(strs[i].charAt(j) >= 'a' && strs[i].charAt(j) <= 'f') &&
94+
!(strs[i].charAt(j) >= 'A' && strs[i].charAt(j) <= 'F')) {
95+
return false;
96+
}
97+
}
98+
}
99+
return true;
100+
}
101+
}

0 commit comments

Comments
 (0)