题解:3sum问题变型,同样采取排序+双指针,但不需要再考虑重复问题。
此题目标为使target和三数值之和的差值绝对值最小 ,循环过程中标记最小差值。
在此过程中,考虑到target可能为负值,双指针移动的方向有两种情况:当差值为负值时,表示target比三数值之和小,移动方向要求在第一个数固定时,二三位数之和要往小的方向移动,故右指针左移;同理,差值为正值,左指针右移;差值为0,直接返回target。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int mindif=10000;
int n=nums.size();
for(int i=0;i<n-2;i++)
{
int j=i+1;
int k=n-1;
int dir=target-nums[i];
while(j<k&&j>i&&k<n)
{
int d=dir-nums[j]-nums[k];
if(abs(d)<abs(mindif)) mindif=d;
if(d<0){
k--;
}else if(d>0){
j++;
}else{
return target;
}
}
}
return target-mindif;
}
};
分析:根据字典key-value特性,选择将括号存储进unordered_map中,
//只要遇到的不是右括号,就将s中的元素push进stack,是的话,就弹出一个,判断是否对应,不对应则返回false,对应则继续。
class Solution {
public:
bool isValid(string s) {
if(s=="")return true;
std::stack<char>st;
unordered_map<char,char>mmap;
mmap['}']='{';
mmap[']']='[';
mmap[')']='(';
for(char i:s)
{
if(i!=')'&&i!=']'&&i!='}')
st.push(i);
else{
if(st.empty()||st.top()!=mmap[i])return false;
st.pop();
}
}
if(!st.empty()) return false;
return true;
}
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
/**
* 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) {
if(l1==nullptr||l2==nullptr)
return (l1==nullptr)?l2:l1;
ListNode*p=(l1->val<=l2->val)?l1:l2;
if(p==l1)l1=l1->next;
else l2=l2->next;
ListNode*head=p;
while(l1!=nullptr&&l2!=nullptr)
{
if(l1->val<=l2->val)
{
p->next=l1;
l1=l1->next;
}else{
p->next=l2;
l2=l2->next;
}
p=p->next;
}
if(l1!=nullptr){
p->next=l1;
}
if(l2!=nullptr)
{
p->next=l2;
}
return head;
}
};