Leetcode-20 有效的括号(简单)
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
思路:
-
将(),{},[] 放入到HashMap中存储
-
借用栈存储扫描内容
为什么要使用栈呢?
栈:后进先出,最近匹配。匹配最近符合的括号,形成一对。
-
从头开始扫描,依次放入栈中,若扫描到的字符能够与栈顶元素匹配成功,形成一对括号,移除栈顶元素,继续扫描
-
扫描结束,若栈中无元素,表示所给字符括号全部完全匹配
class Solution {
private HashMap<Character, Character> mappings;
public Solution() {
this.mappings = new HashMap<Character, Character>();
this.mappings.put(')', '(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
//使用栈存放未匹配过的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (this.mappings.containsKey(c)) {
// Map是否包含 ),},]
char topElement = stack.empty() ? '#' : stack.pop();
//如果栈为空 topElement = ‘#’,否则就弹出栈顶元素作为topElement的值
if (topElement != this.mappings.get(c)) {
// 如果topElement(栈顶元素) 和 c应该匹配的值是一样的,那么就匹配成功
// 如果不一样,表示匹配失败了,就直接返回flase
return false;
}
} else {
//匹配成功,执行该分支,将c加入栈顶,即:c是未匹配过的字符
stack.push(c);
}
}
return stack.isEmpty();
}
}
参考链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
Leetcode-21 合并两个有序链表
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:(归并排序,递归)
-
将两个链表分别抽象为一个个单独的元素。(两个链表记为L1,L2)
-
对比两个链表的头结点的值,如果L1的头结点的值比L2的小,那么就把L1的头结点单独出来
-
接着比对L1的next 与L2的头节点的值谁大谁小,小的值作为L1的next。
(就是在刨除L1的头结点后,在剩下的元素中对于最小的两个元素比谁大谁小,即重复2的过程,也就是开始递归)
-
比较完所有元素递归就应该结束了
-
此时已经形成了一个排好序的链表。
-
那此时我应该返回的是哪个链表呢?L1?L2?
返回非空链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
else if (l2 == null) {
return l1;
}
else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
参考链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/
来源:力扣(LeetCode)
Leetcode-26 删除排序数组中的重复项
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。(要求原地工作)
思路:(双指针法)
- i,j 借助两个指针,i = 0; nums[i] = 首元素,j从1开始,进行循环<nums.length
- 判断第二个元素 是否等于一个元素,如果等于即表示出现重复元素,i不变
- 若第三个元素不等于第二个元素,表示nums[2]未重复,让i++,把第二个元素赋值为第三个元素。
- 用指针i 来记录元素是否重复,如果未重复i++,重复了i就不变,保证nums[i]是未重复数组的最后一个元素。
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
参考链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-by-/
来源:力扣(LeetCode)
Leetcode-27 移除元素
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
思路:(双指针法,类似与26题)
- i,j 两个指针,i = 0,j = 0;
- j = 0;开始循环,如果nums[i ] == val , 什么都不做,如果nums[i] != val, nums[i] = nums[j] ,i++
- i 表示的是不该去除元素组成的数组下标,j表示整个数组下标
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
参考链接:https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode/
来源:力扣(LeetCode)