Skip to content

Commit f6f2049

Browse files
committed
LeetCode 题解 1574~1584
1 parent 782092c commit f6f2049

File tree

7 files changed

+236
-0
lines changed

7 files changed

+236
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public int findLengthOfShortestSubarray(int[] arr) {
3+
int n = arr.length;
4+
int left = 0;
5+
while (left + 1 < n && arr[left] <= arr[left + 1]) {
6+
left++;
7+
}
8+
if (left == n - 1) {
9+
return 0;
10+
}
11+
int right = n - 1;
12+
while (right > 0 && arr[right - 1] <= arr[right]) {
13+
right--;
14+
}
15+
16+
int res = Math.min(n - left - 1, right);
17+
18+
int i = 0, j = right;
19+
20+
while (i <= left && j <= n - 1) {
21+
if (arr[i] <= arr[j]) {
22+
res = Math.min(res, j - i - 1);
23+
i++;
24+
} else {
25+
j++;
26+
}
27+
}
28+
return res;
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public String modifyString(String s) {
3+
char[] chars = s.toCharArray();
4+
5+
for (int i = 0; i < chars.length; i++) {
6+
if (chars[i] == '?') {
7+
// 前面的字符
8+
char ahead = i == 0 ? ' ' : chars[i - 1];
9+
// 最后的字符
10+
char behind = i == chars.length - 1 ? ' ' : chars[i + 1];
11+
char temp = 'a';
12+
while (temp == ahead || temp == behind ) {
13+
temp++;
14+
}
15+
chars[i] = temp;
16+
}
17+
}
18+
return new String(chars);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int minCost(String s, int[] cost) {
3+
int res = 0;
4+
char[] word = s.toCharArray();
5+
for(int i = 0;i < word.length;i++){
6+
char c = word[i];
7+
int max = cost[i];
8+
int sum = max;
9+
while(i + 1 < word.length && word[i + 1] == c){
10+
sum += cost[++i];
11+
max = Math.max(max,cost[i]);
12+
}
13+
if(sum != max){
14+
res += sum - max;
15+
}
16+
}
17+
return res;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Solution {
2+
// https://oi-wiki.org/ds/dsu/#_3
3+
private boolean[] used;
4+
5+
public int maxNumEdgesToRemove(int n, int[][] edges) {
6+
used = new boolean[edges.length];
7+
// type 为倒序,3, 2, 1
8+
Arrays.sort(edges, (a, b) -> Integer.compare(b[0], a[0]));
9+
if (!unionFind(n, edges, 1)) return -1;
10+
if (!unionFind(n, edges, 2)) return -1;
11+
int result = 0;
12+
for (boolean u : used) {
13+
result += u ? 0 : 1;
14+
}
15+
return result;
16+
}
17+
18+
private boolean unionFind(int n, int[][] edges, int excludedType) {
19+
int[] union = new int[n + 1];
20+
for (int i = 1; i <= n; i++) {
21+
union[i] = i;
22+
}
23+
int cnt = 0;
24+
for (int i = 0; i < edges.length; i++) {
25+
int[] edge = edges[i];
26+
if (edge[0] == excludedType) continue;
27+
int rootA = findRoot(union, edge[1]);
28+
int rootB = findRoot(union, edge[2]);
29+
if (rootA != rootB) {
30+
cnt += 1;
31+
union[rootA] = rootB;
32+
used[i] = true;
33+
}
34+
if (cnt == n - 1) return true;
35+
}
36+
return false;
37+
}
38+
39+
private int findRoot(int[] union, int idx) {
40+
if (union[idx] != idx) {
41+
int root = findRoot(union, union[idx]);
42+
union[idx] = root;
43+
return root;
44+
}
45+
return idx;
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public int numSpecial(int[][] mat) {
3+
int rows = mat.length;
4+
int cols = mat[0].length;
5+
6+
int[] rows1 = new int[rows];
7+
int[] cols1 = new int[cols];
8+
for (int i = 0; i < rows; i++) {
9+
for (int j = 0; j < cols; j++) {
10+
if (mat[i][j] == 1) {
11+
rows1[i]++;
12+
cols1[j]++;
13+
}
14+
}
15+
}
16+
17+
int ans = 0;
18+
for (int i = 0; i < rows; i++) {
19+
for (int j = 0; j < cols; j++) {
20+
if (mat[i][j] == 1 && rows1[i] == 1 && cols1[j] == 1) {
21+
ans ++;
22+
}
23+
}
24+
}
25+
26+
return ans;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public int unhappyFriends(int n, int[][] preferences, int[][] pairs) {
3+
Map<Integer, Set<Integer>> map = new HashMap<>();
4+
for (int[] pair : pairs) {
5+
calcBetter(preferences[pair[0]], map, pair[0], pair[1]);
6+
calcBetter(preferences[pair[1]], map, pair[1], pair[0]);
7+
}
8+
Set<Integer> set = new HashSet<>();
9+
for (int i = 0; i < pairs.length; i++) {
10+
for (int j = i + 1; j < pairs.length; j++) {
11+
if (unhappy(pairs[i][0], pairs[j][0], map)) {
12+
set.add(pairs[i][0]);
13+
set.add(pairs[j][0]);
14+
}
15+
if (unhappy(pairs[i][1], pairs[j][0], map)) {
16+
set.add(pairs[i][1]);
17+
set.add(pairs[j][0]);
18+
}
19+
if (unhappy(pairs[i][0], pairs[j][1], map)) {
20+
set.add(pairs[i][0]);
21+
set.add(pairs[j][1]);
22+
}
23+
if (unhappy(pairs[i][1], pairs[j][1], map)) {
24+
set.add(pairs[i][1]);
25+
set.add(pairs[j][1]);
26+
}
27+
}
28+
}
29+
return set.size();
30+
}
31+
32+
private void calcBetter(int[] preference, Map<Integer, Set<Integer>> map, int from, int to) {
33+
Set<Integer> betterSet = new HashSet<>();
34+
for (int i : preference) {
35+
if (i == to) {
36+
break;
37+
}
38+
betterSet.add(i);
39+
}
40+
map.put(from, betterSet);
41+
}
42+
43+
private boolean unhappy(int x, int y, Map<Integer, Set<Integer>> map) {
44+
return map.get(x).contains(y) && map.get(y).contains(x);
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
static class Edge {
3+
4+
int x;
5+
int y;
6+
int len;
7+
8+
Edge(int x, int y, int len) {
9+
this.x = x;
10+
this.y = y;
11+
this.len = len;
12+
}
13+
}
14+
15+
public int minCostConnectPoints(int[][] points) {
16+
Queue<Edge> heap = new PriorityQueue<>(Comparator.comparingInt((Edge e) -> e.len));
17+
boolean[] marked = new boolean[points.length];
18+
marked[0] = true;
19+
addVertex(points, marked, 0, heap);
20+
int count = 1;
21+
int res = 0;
22+
while (!heap.isEmpty()) {
23+
Edge edge = heap.poll();
24+
if (!marked[edge.y]) {
25+
res += edge.len;
26+
marked[edge.y] = true;
27+
addVertex(points, marked, edge.y, heap);
28+
count++;
29+
if (count == points.length) {
30+
break;
31+
}
32+
}
33+
}
34+
return res;
35+
}
36+
37+
public void addVertex(int[][] points, boolean[] marked, int x, Queue<Edge> heap) {
38+
for (int i = 0; i < marked.length; i++) {
39+
if (marked[i]) {
40+
continue;
41+
}
42+
heap.add(new Edge(x, i,
43+
Math.abs(points[x][0] - points[i][0]) + Math.abs(points[x][1] - points[i][1])));
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)