Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add solutions to lc problems: No.3024~3027 #2314

Merged
merged 1 commit into from
Feb 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions solution/3000-3099/3024.Type of Triangle II/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,24 @@ function triangleType(nums: number[]): string {
}
```

```cs
public class Solution {
public string TriangleType(int[] nums) {
Array.Sort(nums);
if (nums[0] + nums[1] <= nums[2]) {
return "none";
}
if (nums[0] == nums[2]) {
return "equilateral";
}
if (nums[0] == nums[1] || nums[1] == nums[2]) {
return "isosceles";
}
return "scalene";
}
}
```

<!-- tabs:end -->

<!-- end -->
18 changes: 18 additions & 0 deletions solution/3000-3099/3024.Type of Triangle II/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,24 @@ function triangleType(nums: number[]): string {
}
```

```cs
public class Solution {
public string TriangleType(int[] nums) {
Array.Sort(nums);
if (nums[0] + nums[1] <= nums[2]) {
return "none";
}
if (nums[0] == nums[2]) {
return "equilateral";
}
if (nums[0] == nums[1] || nums[1] == nums[2]) {
return "isosceles";
}
return "scalene";
}
}
```

<!-- tabs:end -->

<!-- end -->
15 changes: 15 additions & 0 deletions solution/3000-3099/3024.Type of Triangle II/Solution.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public class Solution {
public string TriangleType(int[] nums) {
Array.Sort(nums);
if (nums[0] + nums[1] <= nums[2]) {
return "none";
}
if (nums[0] == nums[2]) {
return "equilateral";
}
if (nums[0] == nums[1] || nums[1] == nums[2]) {
return "isosceles";
}
return "scalene";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,29 @@ function numberOfPairs(points: number[][]): number {
}
```

```cs
public class Solution {
public int NumberOfPairs(int[][] points) {
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
int ans = 0;
int n = points.Length;
int inf = 1 << 30;
for (int i = 0; i < n; ++i) {
int y1 = points[i][1];
int maxY = -inf;
for (int j = i + 1; j < n; ++j) {
int y2 = points[j][1];
if (maxY < y2 && y2 <= y1) {
maxY = y2;
++ans;
}
}
}
return ans;
}
}
```

<!-- tabs:end -->

<!-- end -->
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,29 @@ function numberOfPairs(points: number[][]): number {
}
```

```cs
public class Solution {
public int NumberOfPairs(int[][] points) {
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
int ans = 0;
int n = points.Length;
int inf = 1 << 30;
for (int i = 0; i < n; ++i) {
int y1 = points[i][1];
int maxY = -inf;
for (int j = i + 1; j < n; ++j) {
int y2 = points[j][1];
if (maxY < y2 && y2 <= y1) {
maxY = y2;
++ans;
}
}
}
return ans;
}
}
```

<!-- tabs:end -->

<!-- end -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
public class Solution {
public int NumberOfPairs(int[][] points) {
Array.Sort(points, (a, b) => a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
int ans = 0;
int n = points.Length;
int inf = 1 << 30;
for (int i = 0; i < n; ++i) {
int y1 = points[i][1];
int maxY = -inf;
for (int j = i + 1; j < n; ++j) {
int y2 = points[j][1];
if (maxY < y2 && y2 <= y1) {
maxY = y2;
++ans;
}
}
}
return ans;
}
}
168 changes: 96 additions & 72 deletions solution/3000-3099/3026.Maximum Good Subarray Sum/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,53 +50,56 @@

## 解法

### 方法一
### 方法一:前缀和 + 哈希表

我们用一个哈希表 $p$ 记录 $nums[i]$ 的前缀数组 $nums[0..i-1]$ 的和 $s$,如果有多个相同的 $nums[i]$,我们只保留最小的 $s$。初始时,我们将 $p[nums[0]]$ 设为 $0$。另外,我们用一个变量 $s$ 记录当前的前缀和,初始时 $s = 0$。初始化答案 $ans$ 为 $-\infty$。

接下来,我们枚举 $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$。

最后,如果 $ans = -\infty$,那么我们返回 $0$,否则返回 $ans$。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。

<!-- tabs:start -->

```python
class Solution:
def maximumSubarraySum(self, nums: List[int], k: int) -> int:
p = {}
r = float('-inf')
p[nums[0]] = 0
s = 0
n = len(nums)
for i in range(n):
s += nums[i]
if nums[i] - k in p:
r = max(r, s - p[nums[i] - k])
if nums[i] + k in p:
r = max(r, s - p[nums[i] + k])
if i + 1 == n:
break
if nums[i + 1] not in p or p[nums[i + 1]] > s:
ans = -inf
p = {nums[0]: 0}
s, n = 0, len(nums)
for i, x in enumerate(nums):
s += x
if x - k in p:
ans = max(ans, s - p[x - k])
if x + k in p:
ans = max(ans, s - p[x + k])
if i + 1 < n and (nums[i + 1] not in p or p[nums[i + 1]] > s):
p[nums[i + 1]] = s
return r if r != float('-inf') else 0
return 0 if ans == -inf else ans
```

```java
class Solution {
public long maximumSubarraySum(int[] nums, int k) {
HashMap<Integer, Long> p = new HashMap<>();
long r = Long.MIN_VALUE;
Map<Integer, Long> p = new HashMap<>();
p.put(nums[0], 0L);
long s = 0;
int n = nums.length;
for (int i = 0;; ++i) {
long ans = Long.MIN_VALUE;
for (int i = 0; i < n; ++i) {
s += nums[i];
if (p.containsKey(nums[i] - k)) {
r = Math.max(r, s - p.get(nums[i] - k));
ans = Math.max(ans, s - p.get(nums[i] - k));
}
if (p.containsKey(nums[i] + k)) {
r = Math.max(r, s - p.get(nums[i] + k));
ans = Math.max(ans, s - p.get(nums[i] + k));
}
if (i + 1 == n) break;
if (!p.containsKey(nums[i + 1]) || p.get(nums[i + 1]) > s) {
if (i + 1 < n && (!p.containsKey(nums[i + 1]) || p.get(nums[i + 1]) > s)) {
p.put(nums[i + 1], s);
}
}
return r == Long.MIN_VALUE ? 0 : r;
return ans == Long.MIN_VALUE ? 0 : ans;
}
}
```
Expand All @@ -106,85 +109,106 @@ class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
unordered_map<int, long long> p;
long long r = LONG_LONG_MIN;
p[nums[0]] = 0;
long long s = 0;
const int n = nums.size();
long long ans = LONG_LONG_MIN;
for (int i = 0;; ++i) {
s += nums[i];
auto t = p.find(nums[i] - k);
if (t != p.end()) {
r = max(r, s - t->second);
auto it = p.find(nums[i] - k);
if (it != p.end()) {
ans = max(ans, s - it->second);
}
it = p.find(nums[i] + k);
if (it != p.end()) {
ans = max(ans, s - it->second);
}
t = p.find(nums[i] + k);
if (t != p.end()) {
r = max(r, s - t->second);
if (i + 1 == n) {
break;
}
if (i + 1 == n)
break;
t = p.find(nums[i + 1]);
if (t == p.end() || t->second > s) {
it = p.find(nums[i + 1]);
if (it == p.end() || it->second > s) {
p[nums[i + 1]] = s;
}
}
return r == LONG_LONG_MIN ? 0 : r;
return ans == LONG_LONG_MIN ? 0 : ans;
}
};
```

```go
func maximumSubarraySum(nums []int, k int) int64 {
p := make(map[int]int64)
var r int64 = math.MinInt64
p[nums[0]] = 0
var s int64 = 0
n := len(nums)
for i := 0; ; i++ {
s += int64(nums[i])
if t, ok := p[nums[i]-k]; ok {
r = max(r, s-t)
}
if t, ok := p[nums[i]+k]; ok {
r = max(r, s-t)
}
if i+1 == n {
break
}
if t, ok := p[nums[i+1]]; !ok || t > s {
p[nums[i+1]] = s
}
}
if r == math.MinInt64 {
return 0
}
return r
p := map[int]int64{nums[0]: 0}
var s int64 = 0
n := len(nums)
var ans int64 = math.MinInt64
for i, x := range nums {
s += int64(x)
if t, ok := p[nums[i]-k]; ok {
ans = max(ans, s-t)
}
if t, ok := p[nums[i]+k]; ok {
ans = max(ans, s-t)
}
if i+1 == n {
break
}
if t, ok := p[nums[i+1]]; !ok || s < t {
p[nums[i+1]] = s
}
}
if ans == math.MinInt64 {
return 0
}
return ans
}
```

```ts
function maximumSubarraySum(nums: number[], k: number): number {
const p: Map<number, number> = new Map();
let r: number = Number.MIN_SAFE_INTEGER;
p.set(nums[0], 0);
let ans: number = -Infinity;
let s: number = 0;
const n: number = nums.length;
for (let i = 0; ; ++i) {
for (let i = 0; i < n; ++i) {
s += nums[i];
let t: number | undefined = p.get(nums[i] - k);
if (t !== undefined) {
r = Math.max(r, s - t);
if (p.has(nums[i] - k)) {
ans = Math.max(ans, s - p.get(nums[i] - k)!);
}
t = p.get(nums[i] + k);
if (t !== undefined) {
r = Math.max(r, s - t);
if (p.has(nums[i] + k)) {
ans = Math.max(ans, s - p.get(nums[i] + k)!);
}
if (i + 1 === n) break;
t = p.get(nums[i + 1]);
if (t === undefined || t > s) {
if (i + 1 < n && (!p.has(nums[i + 1]) || p.get(nums[i + 1])! > s)) {
p.set(nums[i + 1], s);
}
}
return r === Number.MIN_SAFE_INTEGER ? 0 : r;
return ans === -Infinity ? 0 : ans;
}
```

```cs
public class Solution {
public long MaximumSubarraySum(int[] nums, int k) {
Dictionary<int, long> p = new Dictionary<int, long>();
p[nums[0]] = 0L;
long s = 0;
int n = nums.Length;
long ans = long.MinValue;
for (int i = 0; i < n; ++i) {
s += nums[i];
if (p.ContainsKey(nums[i] - k)) {
ans = Math.Max(ans, s - p[nums[i] - k]);
}
if (p.ContainsKey(nums[i] + k)) {
ans = Math.Max(ans, s - p[nums[i] + k]);
}
if (i + 1 < n && (!p.ContainsKey(nums[i + 1]) || p[nums[i + 1]] > s)) {
p[nums[i + 1]] = s;
}
}
return ans == long.MinValue ? 0 : ans;
}
}
```

Expand Down
Loading