Datawhale-leetcode第四天打卡(leetcode保姆级教程)——题号016,020,021
今天是打卡的第四天,我们废话少说,直接看题。
第一题最接近的三数之和
题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
图意提示:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
这个题目呢,主要是用了双指针的解题方法。
为什么能用双指针不会错过最优解呢,请看以前的证明
https://leetcode-cn.com/problems/container-with-most-water/solution/zhi-guan-de-shuang-zhi-zhen-fa-jie-shi-by-na-kong/
对于这个题来时,证明我也搞不懂qaq
完整代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n = len(nums)
nums.sort()
re_min = 0 #存储当前最小的差值
for i in range(n):
low = i+1
high = n-1
while low < high:
three_sum = nums[i] + nums[low] + nums[high]
x = target - three_sum #当前三数的差值
if re_min == 0:
re_min = abs(x)
sum_min = three_sum #sum_min为当前最接近的和
if abs(x) < re_min:
re_min = abs(x)
sum_min = three_sum
if three_sum == target:
return target
elif three_sum < target:
low += 1
else:
high -= 1
return sum_min
记得在leetcode里运行。
第二题20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
代码如下
class Solution {
public:
bool isValid(string s) {
if(s.length()==0)
return true;
stack<char> st;
cout<<s.length()<<endl;
s='#'+s+'@';
for(int i=0;i<s.length();i++)
{
if(s[i]=='(')
st.push(s[i]);
else if(s[i]=='{')
st.push(s[i]);
else if(s[i]=='[')
st.push(s[i]);
else if(s[i]=='#')
st.push(s[i]);
else
{
if(s[i]==')')
if(st.top()=='(')
st.pop();
else
st.push(s[i]);
if(s[i]=='}')
if(st.top()=='{')
st.pop();
else
st.push(s[i]);
if(s[i]==']')
if(st.top()=='[')
st.pop();
else
st.push(s[i]);
if(s[i]=='@')
st.pop();
}
}
if(st.empty())
{
return true;
}
else
return false;
}
};
第三题15. 三数之和
这个我不会,菜鸡哭泣,调半天没有调好,总是有问题出现。
有兴趣的大佬可以自己不看题解做做
今天打卡晚的原因
题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
直接上代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode newHead(0);
ListNode *pi = &newHead;
while(l1 && l2) {
if(l1->val > l2->val) swap(l1, l2);
pi->next = l1;
l1 = l1->next;
pi = pi->next;
}
pi->next = l1 ? l1 : l2;
return newHead.next;
}
};
解决任务!(想念世界上最可爱的CC)