Skip to content

Commit 3ea7420

Browse files
committed
新增2题,累积36题
1 parent 5664978 commit 3ea7420

File tree

3 files changed

+132
-11
lines changed

3 files changed

+132
-11
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.cjl.leetcode;
2+
3+
import com.cjl.common.ListNode;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
import java.util.Stack;
8+
9+
/*
10+
20. 有效的括号
11+
给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。
12+
有效字符串需满足:
13+
左括号必须用相同类型的右括号闭合。
14+
左括号必须以正确的顺序闭合。
15+
每个右括号都有一个对应的相同类型的左括号。
16+
示例 1:
17+
输入:s = "()"
18+
输出:true
19+
示例 2:
20+
输入:s = "()[]{}"
21+
输出:true
22+
示例 3:
23+
输入:s = "(]"
24+
输出:false
25+
提示:
26+
1 <= s.length <= 10^4
27+
s 仅由括号 '()[]{}' 组成
28+
*/
29+
public class Question_20 {
30+
31+
// 时间复杂度O(N),空间复杂度O(N)
32+
public boolean solution1(String s) {
33+
if (s.isEmpty()) {
34+
return false;
35+
}
36+
Stack<Character> stack = new Stack<>();
37+
Map<Character, Character> map = new HashMap<Character, Character>() {
38+
{
39+
put('(',')');
40+
put('[',']');
41+
put('{','}');
42+
}
43+
};
44+
for (int i = 0; i < s.length() ; i++) {
45+
switch (s.charAt(i)) {
46+
case '(':
47+
case '[':
48+
case '{':
49+
stack.push(map.get(s.charAt(i)));
50+
break;
51+
default:
52+
if (stack.isEmpty() || stack.pop() != s.charAt(i)) {
53+
return false;
54+
}
55+
}
56+
}
57+
return true;
58+
}
59+
}

src/com/cjl/leetcode/Question_42.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,16 @@ public int solution1(int[] height) {
2424
int sum = 0;
2525
// 去掉头尾两端的列
2626
for (int i = 1; i < height.length - 1; i++) {
27-
int max_left = 0;
27+
int maxLeft = 0;
2828
for (int j = i - 1; j >= 0; j--) {
29-
if (height[j] > max_left) {
30-
max_left = height[j];
31-
}
29+
maxLeft = Math.max(maxLeft, height[j]);
3230
}
33-
int max_right = 0;
34-
for (int j = i + 1; j < height.length - 1; j++) {
35-
if (height[j] > max_right) {
36-
max_right = height[j];
37-
}
31+
int maxRight = 0;
32+
for (int j = i + 1; j < height.length; j++) {
33+
maxRight = Math.max(maxRight, height[j]);
3834
}
3935
// 木桶效应,两者取其短
40-
int min = Math.min(max_left, max_right);
36+
int min = Math.min(maxLeft, maxRight);
4137
// 最短的要大于当前列才能蓄水
4238
if (min > height[i]) {
4339
sum = sum + (min - height[i]);
@@ -61,7 +57,7 @@ public int solution2(int[] height) {
6157
for (int i = 1; i < height.length - 1; i++) {
6258
int min = Math.min(max_left[i],max_right[i]);
6359
if(min > height[i]){
64-
sum += min;
60+
sum += (min - height[i]);
6561
}
6662
}
6763
return sum;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.cjl.leetcode;
2+
3+
/*
4+
20. 有效的括号
5+
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
6+
示例 1:
7+
输入: nums = [-1,0,3,5,9,12], target = 9
8+
输出: 4
9+
解释: 9 出现在 nums 中并且下标为 4
10+
示例 2:
11+
输入: nums = [-1,0,3,5,9,12], target = 2
12+
输出: -1
13+
解释: 2 不存在 nums 中因此返回 -1
14+
提示:
15+
你可以假设 nums 中的所有元素是不重复的。
16+
n 将在 [1, 10000]之间。
17+
nums 的每个元素都将在 [-9999, 9999]之间。
18+
*/
19+
public class Question_704 {
20+
21+
// 遍历法
22+
// 时间复杂度O(nlogn),空间复杂度O(1)
23+
public int solution1(int[] nums, int target) {
24+
int left = 0;
25+
int right = nums.length - 1;
26+
while (left <= right) {
27+
int mid = (right - left) / 2 + left;
28+
if (nums[mid] == target) {
29+
return mid;
30+
} else if (nums[mid] > target) {
31+
right = mid - 1;
32+
} else {
33+
left = mid + 1;
34+
}
35+
}
36+
return -1;
37+
}
38+
39+
// 递归处理法
40+
// 时间复杂度O(nlogn),空间复杂度O(N)
41+
public int solution2(int[] nums, int target) {
42+
if (nums[nums.length - 1] < target) {
43+
return -1;
44+
}
45+
return findTarget(nums, 0, nums.length - 1, target);
46+
}
47+
48+
public int findTarget(int[] nums, int left, int right, int target) {
49+
if (nums[left] == target) {
50+
return left;
51+
} else if (nums[right] == target) {
52+
return right;
53+
}
54+
55+
if (left == right || right - left == 1) {
56+
return -1;
57+
}
58+
59+
int mid = (left + right) / 2;
60+
if (nums[mid] < target) {
61+
return findTarget(nums, mid, right, target);
62+
} else {
63+
return findTarget(nums, left, mid, target);
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)