Skip to content

Commit 94a18e7

Browse files
committed
📝 update alg lc
1 parent 09e7529 commit 94a18e7

3 files changed

Lines changed: 227 additions & 0 deletions

File tree

Java/alg/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@
102102
- [3.无重复字符的最长子串](lc/3.无重复字符的最长子串.md)
103103
- [5.最长回文子串](lc/5.最长回文子串.md)
104104
- [6.Z字形变换](lc/6.Z字形变换.md)
105+
- [11.盛最多水的容器](lc/11.盛最多水的容器.md)
106+
- [15.三数之和](lc/15.三数之和.md)
105107

106108
## 笔试
107109

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# 11. 盛最多水的容器
2+
3+
[url](https://leetcode-cn.com/problems/container-with-most-water/)
4+
5+
## 题目
6+
7+
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
8+
9+
说明:你不能倾斜容器。
10+
11+
![](https://aliyun-lc-upload.oss-cn-hangzhou.aliyuncs.com/aliyun-lc-upload/uploads/2018/07/25/question_11.jpg)
12+
13+
```
14+
输入:[1,8,6,2,5,4,8,3,7]
15+
输出:49
16+
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
17+
输入:height = [1,1]
18+
输出:1
19+
输入:height = [4,3,2,1,4]
20+
输出:16
21+
输入:height = [1,2,1]
22+
输出:2
23+
```
24+
25+
## 方法
26+
27+
28+
29+
## code
30+
31+
### js
32+
33+
```js{cmd="node"}
34+
let maxArea = height => {
35+
// 算面积
36+
let max = 0;
37+
let l = 0, r = height.length - 1;
38+
while (l < r) {
39+
let min = height[l] < height[r] ? height[l++] : height[r--];
40+
max = Math.max(max, (r - l + 1) * min);
41+
}
42+
return max;
43+
};
44+
```
45+
46+
### go
47+
48+
```go
49+
func maxArea(height []int) int {
50+
max := 0
51+
l, r := 0, len(height) - 1
52+
for l < r {
53+
min := 0
54+
if height[l] < height[r] {
55+
min = height[l]
56+
l++
57+
} else {
58+
min = height[r]
59+
r--
60+
}
61+
max = max9(max, (r - l + 1) * min)
62+
}
63+
return max
64+
}
65+
func max9(a int, b int) int {
66+
if a < b {
67+
return b
68+
} else {
69+
return a
70+
}
71+
}
72+
```
73+
74+
### java
75+
76+
```java
77+
class Solution {
78+
public int maxArea(int[] height) {
79+
int max = 0;
80+
int l = 0, r = height.length - 1;
81+
while (l < r){
82+
int min = height[l] < height[r] ? height[l++] : height[r--];
83+
max = Math.max(max, (r - l + 1) * min);
84+
}
85+
return max;
86+
}
87+
}
88+
```
89+

Java/alg/lc/15.三数之和.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# 15. 三数之和
2+
3+
4+
[url](https://leetcode-cn.com/problems/3sum/)
5+
6+
## 题目
7+
8+
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
9+
10+
注意:答案中不可以包含重复的三元组。
11+
12+
13+
```
14+
输入:nums = [-1,0,1,2,-1,-4]
15+
输出:[[-1,-1,2],[-1,0,1]]
16+
输入:nums = []
17+
输出:[]
18+
输入:nums = [0]
19+
输出:[]
20+
```
21+
22+
## 方法
23+
24+
25+
## code
26+
27+
### js
28+
29+
```js
30+
let treeSum = nums => {
31+
let ret = [];
32+
if (nums === null || nums.length === 0)
33+
return ret;
34+
nums.sort();
35+
for (let i = 0; i < nums.length - 2; i++) {
36+
if (nums[i] > 0)
37+
break;
38+
if (i !== 0 && nums[i] === nums[i - 1])
39+
continue;
40+
let l = i + 1, r = nums.length - 1;
41+
while (l < r) {
42+
let sum = nums[l] + nums[r];
43+
if (sum < -nums[i])
44+
l++;
45+
else if (sum > -nums[i])
46+
r--;
47+
else {
48+
ret.push([nums[i], nums[l], nums[r]]);
49+
// 防止重复
50+
while (l < r && nums[l] === nums[l + 1]) l++;
51+
while (l < r && nums[r] === nums[r - 1]) r--;
52+
l++;
53+
r--;
54+
}
55+
}
56+
}
57+
return ret;
58+
};
59+
```
60+
61+
### go
62+
63+
```go
64+
func threeSum(nums []int) [][]int {
65+
res := make([][]int, 0)
66+
if nums == nil || len(nums) == 0 {
67+
return res
68+
}
69+
sort.Ints(nums)
70+
for i := 0; i < len(nums)-2; i++ {
71+
if nums[i] > 0 {
72+
break
73+
}
74+
if i != 0 && nums[i] == nums[i-1] {
75+
continue
76+
}
77+
l, r := i + 1, len(nums) - 1
78+
for l < r {
79+
sum := nums[l] + nums[r]
80+
if sum < -nums[i] {
81+
l++
82+
} else if sum > -nums[i] {
83+
r--
84+
} else {
85+
res = append(res, []int{nums[i], nums[l], nums[r]})
86+
for l < r && nums[l] == nums[l+1] {
87+
l++
88+
}
89+
for l < r && nums[r] == nums[r-1] {
90+
r--
91+
}
92+
l++
93+
r--
94+
}
95+
}
96+
}
97+
return res
98+
}
99+
```
100+
101+
### java
102+
103+
```java
104+
class Solution {
105+
public List<List<Integer>> threeSum(int[] nums) {
106+
List<List<Integer>> ret = new ArrayList<>();
107+
if (nums == null || nums.length == 0)
108+
return ret;
109+
Arrays.sort(nums);
110+
for (int i = 0; i < nums.length - 2; i++){
111+
if (nums[i] > 0)
112+
break;
113+
if (i != 0 && nums[i] == nums[i - 1])
114+
continue;
115+
int l = i + 1, r = nums.length - 1;
116+
while (l < r){
117+
int sum = nums[l] + nums[r];
118+
if (sum < -nums[i])
119+
l++;
120+
else if (sum > -nums[i])
121+
r--;
122+
else {
123+
ret.add(Arrays.asList(nums[i], nums[l], nums[r]));
124+
// 防止重复
125+
while (l < r && nums[l] == nums[l + 1]) l++;
126+
while (l < r && nums[r] == nums[r - 1]) r--;
127+
l++;
128+
r--;
129+
}
130+
}
131+
}
132+
return ret;
133+
}
134+
}
135+
```
136+

0 commit comments

Comments
 (0)