第二十二天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
一、82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//将不止一个该元素的节点删除,排序后,重复的节点都是连续的
//如果当前节点的下一个节点有且与当前元素的val相同,就删除下一个节点,知道后面没有符合条件的节点,再删除当前节点,指针后移
if (!head){
return head;
}
ListNode* dummy = new ListNode();
dummy->next = head;//定义一个哑节点,用于处理头节点可能被删除的情况
ListNode* cur = dummy;//当前指针位置
while (cur->next && cur->next->next){
if (cur->next->val == cur->next->next->val){
int x = cur->next->val;
while (cur->next && cur->next->val == x){
cur->next = cur->next->next;
}
}
else {
cur = cur->next;
}
}
return dummy->next;
}
};
二、15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//三重循环可得答案,因为在确定了第一个数后,第二个数增加,则第三个数应该越小,可以用双指针来代替第三重循环,优化时间
sort(nums.begin(), nums.end());
int n = nums.size();
vector<vector<int>> ans;
for (int first = 0; first < n; ++first){
if (first > 0 && nums[first] == nums[first - 1]) continue;
int third = n - 1;
int target = - nums[first];
for (int second = first + 1; second < n; ++second){
if (second > (first + 1) && nums[second] == nums[second - 1]) continue;
while (second < third && nums[second] + nums[third] > target){//后序不会再有符合条件的third,范围缩小
--third;
}
if (second == third){
break;
}
if (nums[second] + nums[third] == target){
ans.push_back({nums[first], nums[second], nums[third]});
}
}
}
return ans;
}
};
三、844. 比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。
如果相等,返回 true ;否则,返回 false 。
注意:如果对空文本输入退格字符,文本继续为空。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool backspaceCompare(string s, string t) {
//退格表示删除前一个元素,如果前面没有元素,则继续为空
//双指针,分别标记两个串末尾,遇到一个#则表示前面需要删除一个元素,遍历至不需要删除的元素,然后判断
int i = s.size() - 1, j = t.size() - 1;
int DelS = 0, DelT = 0;//用来对退格计数
while (i >= 0 || j >= 0){//直至两串都遍历完全
while (i >= 0){
if (s[i] == '#'){
++DelS;
--i;
}
else if (DelS > 0){//该元素需要删除
--DelS;
--i;
}
else {//不需要删除元素,用来对比的元素
break;
}
}
while (j >= 0){
if (t[j] == '#'){
++DelT;
--j;
}
else if (DelT > 0){
--DelT;
--j;
}
else {
break;
}
}
if (i >= 0 && j >= 0) {
if (s[i] != t[j]) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
--i;
--j;
}
return true;
}
};