三数之和
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n=len(nums)
closest=float(‘inf’)
for i in range(n):
l,r=i+1,n-1
while l<r:
cur_s=nums[i]+nums[l]+nums[r]
cur_dif=cur_s-target
if abs(cur_dif)<abs(closest-target):
closest=cur_s
if cur_dif==0:
return target
elif cur_dif<0:
l+=1
elif cur_dif>0:
r-=1
return closest
有效的括号
class Solution:
def isValid(self, s: str) -> bool:
stack=[]
cacha={’(’:’)’,’[’:’]’,’{’:’}’}
for c in s:
if c in cacha:
stack.append©
continue
if len(stack)0 or cacha[stack.pop()]!=c:
return False
return len(stack)0
对于这种匹配的题,发现栈是最简单明了的。可以一一对应。让我想起了之前的广度遍历二叉树。另附想不借助栈但是错了的解法
class Solution {
public:
bool isValid(string s) {
int n=s.length();
int a=0,a1=0,b=0,b1=0,c=0,c1=0;
for(int i=0;i<n;i++){
if(s[i]’(’)
a++;
if(s[i]’)’)
a1++;
if((a1-a)>0)
return false;
if(s[i]’[’)
b++;
if(s[i]’]’)
b1++;
if((b1-b)>0)
return false;
if(s[i]’{’)
c++;
if(s[i]’}’)
c1++;
if((c1-c)>0)
return false;
if(((a-a1)0)&&((b-b1)!=0||(c-c1)!=0))
return false;
if(((b-b1)0)&&((c-c1)!=0||(a-a1)!=0))
return false;
if(((c-c1)0)&&((b-b1)!=0||(a-a1)!=0))
return false;
}if(aa1&&bb1&&cc1)
return true;
else return false;
}
};
希望哪天能想到完善它的办法。
合并两个链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1null||l2null)
return l1null?l2:l1;
if(l1.val<=l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}
else{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
}
}
借助递归极大减少了代码量,但是对于递归思想还是有些不熟悉。
以下是非递归做法,但是对于l1 l2 同时为空的情况 总是修改不对,对于空指针这个难题,还是力不从心 同样附上错误代码,希望有一天能够解决。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *l3;
ListNode * pa;
ListNode * pb;
ListNode * pc;
if(l1nullptr&&l2==nullptr)
return NULL;
pa=l1;
pb=l2;
l3=pc=l1;
while(pa&&pb)
{
if(pa->val<pb->val)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->val>pb->val)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else if(pa->val==pb->val)
{
pc->next=pa;
pc->next->next=pb;
pc=pb;
pa=pa->next;
pb=pb->next;
}
}
return l3;
}
};