Skip to content

Commit cbbb894

Browse files
acbinyanglbme
andauthored
feat: add solutions to lc problems: No.3024~3027 (doocs#2314)
Co-authored-by: yanglbme <szuyanglb@outlook.com>
1 parent 5d2197d commit cbbb894

File tree

17 files changed

+461
-217
lines changed

17 files changed

+461
-217
lines changed

solution/3000-3099/3024.Type of Triangle II/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ function triangleType(nums: number[]): string {
145145
}
146146
```
147147

148+
```cs
149+
public class Solution {
150+
public string TriangleType(int[] nums) {
151+
Array.Sort(nums);
152+
if (nums[0] + nums[1] <= nums[2]) {
153+
return "none";
154+
}
155+
if (nums[0] == nums[2]) {
156+
return "equilateral";
157+
}
158+
if (nums[0] == nums[1] || nums[1] == nums[2]) {
159+
return "isosceles";
160+
}
161+
return "scalene";
162+
}
163+
}
164+
```
165+
148166
<!-- tabs:end -->
149167

150168
<!-- end -->

solution/3000-3099/3024.Type of Triangle II/README_EN.md

+18
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,24 @@ function triangleType(nums: number[]): string {
141141
}
142142
```
143143

144+
```cs
145+
public class Solution {
146+
public string TriangleType(int[] nums) {
147+
Array.Sort(nums);
148+
if (nums[0] + nums[1] <= nums[2]) {
149+
return "none";
150+
}
151+
if (nums[0] == nums[2]) {
152+
return "equilateral";
153+
}
154+
if (nums[0] == nums[1] || nums[1] == nums[2]) {
155+
return "isosceles";
156+
}
157+
return "scalene";
158+
}
159+
}
160+
```
161+
144162
<!-- tabs:end -->
145163

146164
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
public class Solution {
2+
public string TriangleType(int[] nums) {
3+
Array.Sort(nums);
4+
if (nums[0] + nums[1] <= nums[2]) {
5+
return "none";
6+
}
7+
if (nums[0] == nums[2]) {
8+
return "equilateral";
9+
}
10+
if (nums[0] == nums[1] || nums[1] == nums[2]) {
11+
return "isosceles";
12+
}
13+
return "scalene";
14+
}
15+
}

solution/3000-3099/3025.Find the Number of Ways to Place People I/README.md

+23
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,29 @@ function numberOfPairs(points: number[][]): number {
189189
}
190190
```
191191

192+
```cs
193+
public class Solution {
194+
public int NumberOfPairs(int[][] points) {
195+
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
196+
int ans = 0;
197+
int n = points.Length;
198+
int inf = 1 << 30;
199+
for (int i = 0; i < n; ++i) {
200+
int y1 = points[i][1];
201+
int maxY = -inf;
202+
for (int j = i + 1; j < n; ++j) {
203+
int y2 = points[j][1];
204+
if (maxY < y2 && y2 <= y1) {
205+
maxY = y2;
206+
++ans;
207+
}
208+
}
209+
}
210+
return ans;
211+
}
212+
}
213+
```
214+
192215
<!-- tabs:end -->
193216

194217
<!-- end -->

solution/3000-3099/3025.Find the Number of Ways to Place People I/README_EN.md

+23
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,29 @@ function numberOfPairs(points: number[][]): number {
178178
}
179179
```
180180

181+
```cs
182+
public class Solution {
183+
public int NumberOfPairs(int[][] points) {
184+
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
185+
int ans = 0;
186+
int n = points.Length;
187+
int inf = 1 << 30;
188+
for (int i = 0; i < n; ++i) {
189+
int y1 = points[i][1];
190+
int maxY = -inf;
191+
for (int j = i + 1; j < n; ++j) {
192+
int y2 = points[j][1];
193+
if (maxY < y2 && y2 <= y1) {
194+
maxY = y2;
195+
++ans;
196+
}
197+
}
198+
}
199+
return ans;
200+
}
201+
}
202+
```
203+
181204
<!-- tabs:end -->
182205

183206
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
public class Solution {
2+
public int NumberOfPairs(int[][] points) {
3+
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
4+
int ans = 0;
5+
int n = points.Length;
6+
int inf = 1 << 30;
7+
for (int i = 0; i < n; ++i) {
8+
int y1 = points[i][1];
9+
int maxY = -inf;
10+
for (int j = i + 1; j < n; ++j) {
11+
int y2 = points[j][1];
12+
if (maxY < y2 && y2 <= y1) {
13+
maxY = y2;
14+
++ans;
15+
}
16+
}
17+
}
18+
return ans;
19+
}
20+
}

solution/3000-3099/3026.Maximum Good Subarray Sum/README.md

+96-72
Original file line numberDiff line numberDiff line change
@@ -50,53 +50,56 @@
5050

5151
## 解法
5252

53-
### 方法一
53+
### 方法一:前缀和 + 哈希表
54+
55+
我们用一个哈希表 $p$ 记录 $nums[i]$ 的前缀数组 $nums[0..i-1]$ 的和 $s$,如果有多个相同的 $nums[i]$,我们只保留最小的 $s$。初始时,我们将 $p[nums[0]]$ 设为 $0$。另外,我们用一个变量 $s$ 记录当前的前缀和,初始时 $s = 0$。初始化答案 $ans$ 为 $-\infty$。
56+
57+
接下来,我们枚举 $nums[i]$,并且维护一个变量 $s$ 表示 $nums[0..i]$ 的和。如果 $nums[i] - k$ 在 $p$ 中,那么我们就找到了一个好子数组,将答案更新为 $ans = \max(ans, s - p[nums[i] - k])$。同理,如果 $nums[i] + k$ 在 $p$ 中,那么我们也找到了一个好子数组,将答案更新为 $ans = \max(ans, s - p[nums[i] + k])$。然后,如果 $i + 1 \lt n$ 并且 $nums[i + 1]$ 不在 $p$ 中,或者 $p[nums[i + 1]] \gt s$,我们就将 $p[nums[i + 1]]$ 设为 $s$。
58+
59+
最后,如果 $ans = -\infty$,那么我们返回 $0$,否则返回 $ans$。
60+
61+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。
5462

5563
<!-- tabs:start -->
5664

5765
```python
5866
class Solution:
5967
def maximumSubarraySum(self, nums: List[int], k: int) -> int:
60-
p = {}
61-
r = float('-inf')
62-
p[nums[0]] = 0
63-
s = 0
64-
n = len(nums)
65-
for i in range(n):
66-
s += nums[i]
67-
if nums[i] - k in p:
68-
r = max(r, s - p[nums[i] - k])
69-
if nums[i] + k in p:
70-
r = max(r, s - p[nums[i] + k])
71-
if i + 1 == n:
72-
break
73-
if nums[i + 1] not in p or p[nums[i + 1]] > s:
68+
ans = -inf
69+
p = {nums[0]: 0}
70+
s, n = 0, len(nums)
71+
for i, x in enumerate(nums):
72+
s += x
73+
if x - k in p:
74+
ans = max(ans, s - p[x - k])
75+
if x + k in p:
76+
ans = max(ans, s - p[x + k])
77+
if i + 1 < n and (nums[i + 1] not in p or p[nums[i + 1]] > s):
7478
p[nums[i + 1]] = s
75-
return r if r != float('-inf') else 0
79+
return 0 if ans == -inf else ans
7680
```
7781

7882
```java
7983
class Solution {
8084
public long maximumSubarraySum(int[] nums, int k) {
81-
HashMap<Integer, Long> p = new HashMap<>();
82-
long r = Long.MIN_VALUE;
85+
Map<Integer, Long> p = new HashMap<>();
8386
p.put(nums[0], 0L);
8487
long s = 0;
8588
int n = nums.length;
86-
for (int i = 0;; ++i) {
89+
long ans = Long.MIN_VALUE;
90+
for (int i = 0; i < n; ++i) {
8791
s += nums[i];
8892
if (p.containsKey(nums[i] - k)) {
89-
r = Math.max(r, s - p.get(nums[i] - k));
93+
ans = Math.max(ans, s - p.get(nums[i] - k));
9094
}
9195
if (p.containsKey(nums[i] + k)) {
92-
r = Math.max(r, s - p.get(nums[i] + k));
96+
ans = Math.max(ans, s - p.get(nums[i] + k));
9397
}
94-
if (i + 1 == n) break;
95-
if (!p.containsKey(nums[i + 1]) || p.get(nums[i + 1]) > s) {
98+
if (i + 1 < n && (!p.containsKey(nums[i + 1]) || p.get(nums[i + 1]) > s)) {
9699
p.put(nums[i + 1], s);
97100
}
98101
}
99-
return r == Long.MIN_VALUE ? 0 : r;
102+
return ans == Long.MIN_VALUE ? 0 : ans;
100103
}
101104
}
102105
```
@@ -106,85 +109,106 @@ class Solution {
106109
public:
107110
long long maximumSubarraySum(vector<int>& nums, int k) {
108111
unordered_map<int, long long> p;
109-
long long r = LONG_LONG_MIN;
110112
p[nums[0]] = 0;
111113
long long s = 0;
112114
const int n = nums.size();
115+
long long ans = LONG_LONG_MIN;
113116
for (int i = 0;; ++i) {
114117
s += nums[i];
115-
auto t = p.find(nums[i] - k);
116-
if (t != p.end()) {
117-
r = max(r, s - t->second);
118+
auto it = p.find(nums[i] - k);
119+
if (it != p.end()) {
120+
ans = max(ans, s - it->second);
121+
}
122+
it = p.find(nums[i] + k);
123+
if (it != p.end()) {
124+
ans = max(ans, s - it->second);
118125
}
119-
t = p.find(nums[i] + k);
120-
if (t != p.end()) {
121-
r = max(r, s - t->second);
126+
if (i + 1 == n) {
127+
break;
122128
}
123-
if (i + 1 == n)
124-
break;
125-
t = p.find(nums[i + 1]);
126-
if (t == p.end() || t->second > s) {
129+
it = p.find(nums[i + 1]);
130+
if (it == p.end() || it->second > s) {
127131
p[nums[i + 1]] = s;
128132
}
129133
}
130-
return r == LONG_LONG_MIN ? 0 : r;
134+
return ans == LONG_LONG_MIN ? 0 : ans;
131135
}
132136
};
133137
```
134138
135139
```go
136140
func maximumSubarraySum(nums []int, k int) int64 {
137-
p := make(map[int]int64)
138-
var r int64 = math.MinInt64
139-
p[nums[0]] = 0
140-
var s int64 = 0
141-
n := len(nums)
142-
for i := 0; ; i++ {
143-
s += int64(nums[i])
144-
if t, ok := p[nums[i]-k]; ok {
145-
r = max(r, s-t)
146-
}
147-
if t, ok := p[nums[i]+k]; ok {
148-
r = max(r, s-t)
149-
}
150-
if i+1 == n {
151-
break
152-
}
153-
if t, ok := p[nums[i+1]]; !ok || t > s {
154-
p[nums[i+1]] = s
155-
}
156-
}
157-
if r == math.MinInt64 {
158-
return 0
159-
}
160-
return r
141+
p := map[int]int64{nums[0]: 0}
142+
var s int64 = 0
143+
n := len(nums)
144+
var ans int64 = math.MinInt64
145+
for i, x := range nums {
146+
s += int64(x)
147+
if t, ok := p[nums[i]-k]; ok {
148+
ans = max(ans, s-t)
149+
}
150+
if t, ok := p[nums[i]+k]; ok {
151+
ans = max(ans, s-t)
152+
}
153+
if i+1 == n {
154+
break
155+
}
156+
if t, ok := p[nums[i+1]]; !ok || s < t {
157+
p[nums[i+1]] = s
158+
}
159+
}
160+
if ans == math.MinInt64 {
161+
return 0
162+
}
163+
return ans
161164
}
162165
```
163166

164167
```ts
165168
function maximumSubarraySum(nums: number[], k: number): number {
166169
const p: Map<number, number> = new Map();
167-
let r: number = Number.MIN_SAFE_INTEGER;
168170
p.set(nums[0], 0);
171+
let ans: number = -Infinity;
169172
let s: number = 0;
170173
const n: number = nums.length;
171-
for (let i = 0; ; ++i) {
174+
for (let i = 0; i < n; ++i) {
172175
s += nums[i];
173-
let t: number | undefined = p.get(nums[i] - k);
174-
if (t !== undefined) {
175-
r = Math.max(r, s - t);
176+
if (p.has(nums[i] - k)) {
177+
ans = Math.max(ans, s - p.get(nums[i] - k)!);
176178
}
177-
t = p.get(nums[i] + k);
178-
if (t !== undefined) {
179-
r = Math.max(r, s - t);
179+
if (p.has(nums[i] + k)) {
180+
ans = Math.max(ans, s - p.get(nums[i] + k)!);
180181
}
181-
if (i + 1 === n) break;
182-
t = p.get(nums[i + 1]);
183-
if (t === undefined || t > s) {
182+
if (i + 1 < n && (!p.has(nums[i + 1]) || p.get(nums[i + 1])! > s)) {
184183
p.set(nums[i + 1], s);
185184
}
186185
}
187-
return r === Number.MIN_SAFE_INTEGER ? 0 : r;
186+
return ans === -Infinity ? 0 : ans;
187+
}
188+
```
189+
190+
```cs
191+
public class Solution {
192+
public long MaximumSubarraySum(int[] nums, int k) {
193+
Dictionary<int, long> p = new Dictionary<int, long>();
194+
p[nums[0]] = 0L;
195+
long s = 0;
196+
int n = nums.Length;
197+
long ans = long.MinValue;
198+
for (int i = 0; i < n; ++i) {
199+
s += nums[i];
200+
if (p.ContainsKey(nums[i] - k)) {
201+
ans = Math.Max(ans, s - p[nums[i] - k]);
202+
}
203+
if (p.ContainsKey(nums[i] + k)) {
204+
ans = Math.Max(ans, s - p[nums[i] + k]);
205+
}
206+
if (i + 1 < n && (!p.ContainsKey(nums[i + 1]) || p[nums[i + 1]] > s)) {
207+
p[nums[i + 1]] = s;
208+
}
209+
}
210+
return ans == long.MinValue ? 0 : ans;
211+
}
188212
}
189213
```
190214

0 commit comments

Comments
 (0)