目录
一、最接近三数之和
1、题目描述
2、题解
3、源码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
best = 10**7
n = len(nums)
nums.sort()
for i in range(n):
if i > 0 and nums[i] == nums[i - 1]:
continue
L = i + 1
R = n - 1
while L < R:
s = nums[i] + nums[L] + nums[R]
if s == target:
return target
if abs(s - target) < abs(best - target):
best = s
if s > target:
R -= 1
while L < R and nums[R] == nums [R + 1]:
R -=1
else:
L +=1
while L < R and nums[L] == nums[L - 1]:
L +=1
return best
二、电话号码的字母组合
1、题目描述
2、题解
3、源码
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if digits == '':
return []
phoneMap = {
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz",
}
res = ['']
for num in digits:
chars = phoneMap[num]
new_res = []
for r in res:
for char in chars:
new_res.append(r+char)
res = new_res
return res
三、四数之和
1、题目描述
2、题解
3、源码
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
quadruplets = list()
if not nums or len(nums) < 4:
return quadruplets
nums.sort()
length = len(nums)
for i in range(length - 3):
if i > 0 and nums[i] == nums[i - 1]:#排序之后的去重
continue
if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:#判断最小的和跟目标值的关系
break
if nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target:
continue#用最小的与最大的三数和,一次减少循环
for j in range(i + 1, length - 2):#最右边为有指针的位置
if j > i + 1 and nums[j] == nums[j - 1]:#去重
continue
if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:
break#同样是最小的和与目标值比较
if nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target:
continue
left, right = j + 1, length - 1
while left < right:
total = nums[i] + nums[j] + nums[left] + nums[right]
if total == target:
quadruplets.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
right -= 1
elif total < target:
left += 1
else:
right -= 1
return quadruplets
四、删除链表的倒数第N个结点
1、题目描述
2、题解
3、源码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
def getLength(head: ListNode) -> int:
length = 0
while head:
length += 1
head = head.next
return length
dummy = ListNode(0, head)
length = getLength(head)
cur = dummy
for i in range(1, length - n + 1):
cur = cur.next
cur.next = cur.next.next
return dummy.next
五、有效括号
1、题目描述
2、题解
3、源码
class Solution {
public:
bool isValid(string s) {
stack<int> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
else if (s[i] == '[') st.push(']');
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
else if (st.empty() || st.top() != s[i]) return false;
else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};