Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
Lines changed: 30 additions & 0 deletions
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+
}
Lines changed: 20 additions & 0 deletions
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+
}
Lines changed: 19 additions & 0 deletions
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+
}
Lines changed: 47 additions & 0 deletions
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+
}
Lines changed: 28 additions & 0 deletions
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+
}
Lines changed: 46 additions & 0 deletions
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+
}
Lines changed: 46 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /