感谢Datawhale的组织和马老师等的具体指导
1)三数之和
题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums=sorted(nums)
res=[]
last=True
for i in range(len(nums)-2):
if nums[i]!=last:
sum=-nums[i]
for item in self.findTwosum(nums[i+1:],sum):
res.append([nums[i]]+item)
last=nums[i]
# print res
return res
def findTwosum(self,nums,sum):
left =0
right=len(nums)-1
res=[]
while left<right:
if nums[right]+nums[left]==sum:
if [nums[left],nums[right]] not in res:
res.append([nums[left],nums[right]])
left+=1
elif nums[right]+nums[left]>sum:
right-=1
else:
left+=1
# print nums, sum, res
return res
参考了
链接:https://leetcode-cn.com/problems/two-sum/solution/python-50-shuang-zhi-zhen-fa-by-zuo-lun-jiu-shi-wo/
2)
- Majority Element(求众数)
题目:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
cnt, ret = 0, 0
for num in nums:
if cnt == 0:
ret = num
if num != ret:
cnt -= 1
else:
cnt += 1
return ret
3)环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
【剑指offer同做】
def hasCycle(self, head):
if not head:
return False
while head.next and head.val != None:
head.val = None # 遍历的过程中将值置空
head = head.next
if not head.next: # 如果碰到空发现已经结束,则无环
return False
return True # 否则有环
4)
- Merge k Sorted Lists(合并 k 个排序链表)
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
class Solution {
public ListNode mergeKLists(ListNode[] lists){
if(lists.length == 0)
return null;
if(lists.length == 1)
return lists[0];
if(lists.length == 2){
return mergeTwoLists(lists[0],lists[1]);
}
int mid = lists.length/2;
ListNode[] l1 = new ListNode[mid];
for(int i = 0; i < mid; i++){
l1[i] = lists[i];
}
ListNode[] l2 = new ListNode[lists.length-mid];
for(int i = mid,j=0; i < lists.length; i++,j++){
l2[j] = lists[i];
}
return mergeTwoLists(mergeKLists(l1),mergeKLists(l2));
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode head = null;
if (l1.val <= l2.val){
head = l1;
head.next = mergeTwoLists(l1.next, l2);
} else {
head = l2;
head.next = mergeTwoLists(l1, l2.next);
}
return head;
}
}
参考:https://leetcode-cn.com/problems/merge-k-sorted-lists/comments/43170