Skip to content

Commit cfcb131

Browse files
author
haotf
committed
feat:去除重复字母
1 parent 6003d88 commit cfcb131

3 files changed

+122
-4
lines changed

Diff for: 16.最接近的三数之和.java

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.util.Arrays;
2+
3+
/*
4+
* @lc app=leetcode.cn id=16 lang=java
5+
*
6+
* [16] 最接近的三数之和
7+
*/
8+
9+
// @lc code=start
10+
class Solution {
11+
public int threeSumClosest(int[] nums, int target) {
12+
if (nums.length < 3) {
13+
return 0;
14+
}
15+
// 别忘了要先排序数组
16+
Arrays.sort(nums);
17+
// 记录三数之和与目标值的偏差
18+
int delta = Integer.MAX_VALUE;
19+
for (int i = 0; i < nums.length - 2; i++) {
20+
// 固定 nums[i] 为三数之和中的第一个数,
21+
// 然后对 nums[i+1..] 搜索接近 target - nums[i] 的两数之和
22+
int sum = nums[i] + twoSumClosest(nums, i + 1, target - nums[i]);
23+
if (Math.abs(delta) > Math.abs(target - sum)) {
24+
delta = target - sum;
25+
}
26+
}
27+
return target - delta;
28+
}
29+
30+
// 在 nums[start..] 搜索最接近 target 的两数之和
31+
int twoSumClosest(int[] nums, int start, int target) {
32+
int lo = start, hi = nums.length - 1;
33+
// 记录两数之和与目标值的偏差
34+
int delta = Integer.MAX_VALUE;
35+
while (lo < hi) {
36+
int sum = nums[lo] + nums[hi];
37+
if (Math.abs(delta) > Math.abs(target - sum)) {
38+
delta = target - sum;
39+
}
40+
if (sum < target) {
41+
lo++;
42+
} else {
43+
hi--;
44+
}
45+
}
46+
return target - delta;
47+
}
48+
}
49+
// @lc code=end

Diff for: 316.去除重复字母.java

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import java.util.ArrayDeque;
2+
import java.util.Deque;
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/*
7+
* @lc app=leetcode.cn id=316 lang=java
8+
*
9+
* [316] 去除重复字母
10+
*/
11+
12+
// @lc code=start
13+
class Solution {
14+
public String removeDuplicateLetters(String s) {
15+
16+
Map<Character, Integer> map = new HashMap<>();
17+
Map<Character, Boolean> visited = new HashMap<>();
18+
// 记录每个字符的个数
19+
for (int i = 0; i < s.length(); i++) {
20+
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
21+
visited.put(s.charAt(i), false);
22+
}
23+
24+
StringBuilder result = new StringBuilder();
25+
Deque<Character> stack = new ArrayDeque<>();
26+
for (int i = 0; i < s.length(); i++) {
27+
Character c = s.charAt(i);
28+
if (visited.get(c)) {
29+
map.put(c, map.get(c) - 1);
30+
continue;
31+
}
32+
while (stack.size() > 0) {
33+
Character peek = stack.peek();
34+
if (peek >= c && map.get(peek) > 1) {
35+
visited.put(peek, false);
36+
stack.pop();
37+
map.put(peek, map.get(peek) - 1);
38+
} else {
39+
break;
40+
}
41+
}
42+
stack.push(c);
43+
visited.put(c, true);
44+
}
45+
46+
while (!stack.isEmpty()) {
47+
result.append(stack.pop());
48+
}
49+
50+
return result.reverse().toString();
51+
}
52+
}
53+
// @lc code=end

Diff for: 98.验证二叉搜索树.java

+20-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
/**
99
* Definition for a binary tree node.
1010
* public class TreeNode {
11-
* int val;
11+
* long val;
1212
* TreeNode left;
1313
* TreeNode right;
1414
* TreeNode() {}
15-
* TreeNode(int val) { this.val = val; }
16-
* TreeNode(int val, TreeNode left, TreeNode right) {
15+
* TreeNode(long val) { this.val = val; }
16+
* TreeNode(long val, TreeNode left, TreeNode right) {
1717
* this.val = val;
1818
* this.left = left;
1919
* this.right = right;
@@ -22,7 +22,9 @@
2222
*/
2323
class Solution {
2424
public boolean isValidBST(TreeNode root) {
25-
return valid(root, null, null);
25+
// return valid(root, null, null);
26+
long[] result = traverse(root);
27+
return result[0] == 1;
2628
}
2729

2830
private boolean valid(TreeNode root, TreeNode max, TreeNode min) {
@@ -35,5 +37,19 @@ private boolean valid(TreeNode root, TreeNode max, TreeNode min) {
3537

3638
return valid(root.left, root, min) && valid(root.right, max, root);
3739
}
40+
41+
private long[] traverse(TreeNode root) {
42+
if (root == null)
43+
return new long[] { 1, Long.MAX_VALUE, Long.MIN_VALUE };
44+
45+
long[] left = traverse(root.left);
46+
long[] right = traverse(root.right);
47+
48+
if (left[0] == 0 || right[0] == 0)
49+
return new long[] { 0 };
50+
if (root.val > left[2] && root.val < right[1])
51+
return new long[] { 1, Math.min(left[1], root.val), Math.max(right[2], root.val) };
52+
return new long[] { 0 };
53+
}
3854
}
3955
// @lc code=end

0 commit comments

Comments
 (0)