Leetcode Hot100(Python)

  • 1.两数之和(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Solution(object):
    def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    c=[]
    for i in range(len(nums)-1):
    for j in range(i+1,len(nums)):
    if nums[i]+nums[j]==target:
    c.append(i)
    c.append(j)
    return c
  • 2.两数相加(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, val=0, next=None):
    # self.val = val
    # self.next = next
    class Solution(object):
    def addTwoNumbers(self, l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    """
    c1=[]
    c2=[]
    while l1:
    c1.append(l1.val)
    l1=l1.next
    while l2:
    c2.append(l2.val)
    l2=l2.next
    j1=-1
    j2=-1
    sum1=0
    sum2=0
    for i in range(len(c1)):
    sum1=sum1*10+c1[j1]
    j1=j1-1
    for i in range(len(c2)):
    sum2=sum2*10+c2[j2]
    j2=j2-1
    res=sum1+sum2
    p=head=node=ListNode(None)
    l=len(str(res))
    while l:
    node=ListNode(res%10)
    p.next=node
    p=node
    res/=10
    l-=1
    return head.next
  • 3.无重复字符的最长子串(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution(object):
    def lengthOfLongestSubstring(self, s):
    """
    :type s: str
    :rtype: int
    """
    if len(s)==0:
    return 0
    maxl=0
    i=0
    for j in range(len(s)):
    if s[j] in s[i:j]:
    i = s[i:j].find(s[j])+i+1
    if j-i+1>maxl:
    maxl=j-i+1
    return maxl
  • 4.寻找两个正序数组的中位数(hard)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: float
    """
    for i in nums2:
    nums1.append(i)
    nums1 = sorted(nums1)
    if len(nums1)%2 !=0:
    return nums1[len(nums1)/2]
    else:
    return (nums1[len(nums1)/2]+nums1[len(nums1)/2-1])/2.0
  • 11.盛最多水的容器(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Solution(object):
    def maxArea(self, height):
    """
    :type height: List[int]
    :rtype: int
    """
    i=0
    j=len(height)-1
    res=0
    while i<j:
    h=min(height[i],height[j])
    res=max(res,h*(j-i))
    if height[i]>height[j]:
    j-=1
    else:
    i+=1
    return res
  • 15.三数之和(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    class Solution(object):
    def threeSum(self, nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    #第一种方法,可行但超时
    # if len(nums)==0 or len(nums)==1 or len(nums)==2:
    # return []
    # sum_two=[]
    # d={}
    # res=[]
    # count=0
    # for i in range(len(nums)-1):
    # for j in range(i+1,len(nums)):
    # d[count]=[i,j]
    # sum_two.append(nums[i]+nums[j])
    # count+=1
    # # print(d)
    # # print(sum_two)
    # for i in range(len(nums)):
    # for j in range(len(sum_two)):
    # if i not in d[j] and nums[i]+sum_two[j]==0:
    # temp = [nums[d[j][0]]] + [nums[i]] + [nums[d[j][1]]]
    # temp.sort()
    # if temp not in res:
    # res.append(temp)
    # # res = list(set([tuple(t) for t in res]))
    # # res = list([list(l) for l in res])
    # return res

    #第二种方法,还是超时....
    # d = {}
    # res = []
    # count=0
    # for i in range(len(nums)-1):
    # for j in range(i+1,len(nums)):
    # d[count] = [i,j]
    # count+=1
    # for k in range(len(nums)):
    # for v in d.values():
    # if k not in v and nums[v[0]]+nums[v[1]]+nums[k]==0:
    # temp = [nums[v[0]],nums[v[1]],nums[k]]
    # temp.sort()
    # if temp not in res:
    # res.append(temp)
    # return res

    #参考别人的方法
    d = {}
    res = []
    for i in range(len(nums)):
    d = {}
    for j in range(i + 1, len(nums)):
    key = nums[j]
    if key in d:
    value = d[key] + [key]
    value.sort()
    if value not in res:
    res.append(value)
    key = -nums[i] - nums[j]
    if key not in d:
    d[key] = [nums[i], nums[j]]
    return res
  • 17.电话号码的字母组合(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class Solution(object):
    def letterCombinations(self, digits):
    """
    :type digits: str
    :rtype: List[str]
    """
    res=[]
    d={2:["a","b","c"],3:["d","e","f"],4:["g","h","i"],5:["j","k","l"],6:["m","n","o"],7:["p","q","r","s"],8:["t","u","v"],9:["w","x","y","z"]}
    if len(digits)==0:
    return []
    if len(digits)==1:
    return d[int(digits)]
    l = len(digits)
    if l==2:
    for i in d[int(digits[0])]:
    for j in d[int(digits[1])]:
    res.append(i+j)
    if l==3:
    for i in d[int(digits[0])]:
    for j in d[int(digits[1])]:
    for k in d[int(digits[2])]:
    res.append(i+j+k)
    if l==4:
    for i in d[int(digits[0])]:
    for j in d[int(digits[1])]:
    for k in d[int(digits[2])]:
    for m in d[int(digits[3])]:
    res.append(i+j+k+m)
    return res
  • 19.删除链表的倒数第N个节点(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, val=0, next=None):
    # self.val = val
    # self.next = next
    class Solution(object):
    def removeNthFromEnd(self, head, n):
    """
    :type head: ListNode
    :type n: int
    :rtype: ListNode
    """
    if head.next==None and n==1:
    return None
    """
    nhead:找到需要删除的节点
    pre_nhead:找到需要删除的节点的前一个节点
    temp:通过从temp向后遍历找到倒数第n个节点
    """
    nhead = pre_nhead = temp = head
    flag = 1 #如果flag没变,说明没进while循环,说明要删除的是头节点
    while n-1>0:
    temp =temp.next
    n-=1
    # print(temp.val)
    while temp.next!=None:
    flag = 0
    temp = temp.next
    pre_nhead = nhead
    nhead = nhead.next
    if flag:
    head = head.next
    return head
    pre_nhead.next = nhead.next
    return head
  • 20.有效的括号(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Solution(object):
    def isValid(self, s):
    """
    :type s: str
    :rtype: bool
    """
    c=[]
    j=0
    if s=='':
    return True
    if s[0]==')' or s[0]==']' or s[0]=='}':
    return False
    for i in range(len(s)):
    if len(c)==0:
    c.append(s[i])
    else:
    if (c[-1]=='(' and s[i]==')') or (c[-1]=='[' and s[i]==']') or (c[-1]=='{' and s[i]=='}'):
    c.pop(-1)
    else:
    c.append(s[i])
    if len(c)==0:
    return True
    else:
    return False
  • 21.合并两个有序链表(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, val=0, next=None):
    # self.val = val
    # self.next = next
    class Solution(object):
    def mergeTwoLists(self, l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    """
    res=ListNode(None) #合并之后的新数组
    p=res #保持头节点不动
    if l1==None:
    res.next=l2
    return res.next
    if l2==None:
    res.next=l1
    return res.next
    while l1 and l2:
    if l1.val < l2.val:
    p.next=l1
    l1=l1.next
    else:
    p.next=l2
    l2=l2.next
    p=p.next
    if l1: #如果l1还没循环结束
    p.next=l1
    else: #如果l2还没循环结束
    p.next=l2
    return res.next
  • 39.组合总和(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Solution(object):
    def combinationSum(self, candidates, target):
    """
    :type candidates: List[int]
    :type target: int
    :rtype: List[List[int]]
    """
    def trace(path,result,index):
    if result < 0:
    return
    if result == 0:
    res.append(path)
    return
    for i in range(index,len(candidates)):
    if result >= candidates[i]:
    trace(path+[candidates[i]],result-candidates[i],i)
    else:
    break
    res = []
    candidates.sort()
    trace([],target,0)
    return res
  • 42.接雨水(hard)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    class Solution(object):
    def trap(self, height):
    """
    :type height: List[int]
    :rtype: int
    """
    if len(height) <= 1:
    return 0

    #两层循环时间复杂度太大了。不过思路没问题
    # ans=0
    # start=0
    # end=0
    # max_h = max(height)
    # for i in range(1,max_h+1):
    # for j in range(len(height)):
    # if height[j]>=i:
    # start=j
    # break
    # for k in range(len(height)):
    # if height[len(height)-k-1]>=i:
    # end=len(height)-k-1
    # break
    # for j in range(start+1,end):
    # if height[j]<i:
    # ans+=1
    # return ans

    #找到最大值
    max_h = max(height)
    #找到最大值的下标(第一个最大值)
    index = height.index(max_h)
    ans=0
    temp=0
    #从左到最大值遍历
    for i in range(index):
    if height[i]<height[temp]:
    ans=ans+(height[temp]-height[i])
    else:
    temp=i
    height=list(reversed(height[index:]))
    temp2=0
    for i in range(len(height)):
    if height[i]<height[temp2]:
    ans=ans+(height[temp2]-height[i])
    else:
    temp2=i
    return ans
  • 46.全排列(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Solution(object):
    def permute(self, nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    # res=[]
    # def backtrack(nums,tmp):
    # if not nums:
    # res.append(tmp)
    # return
    # for i in range(len(nums)):
    # backtrack(nums[:i]+nums[i+1:],tmp+[nums[i]])
    # backtrack(nums,[])
    # return res

    if not nums:
    return []
    if len(nums) == 1:
    return [nums]
    ans = []
    for i, n in enumerate(nums):
    ans.extend([[n] + p for p in self.permute(nums[:i] + nums[i + 1:])])
    return ans
  • 48.旋转图像(medium)

    1
    2
    3
    4
    5
    6
    7
    class Solution(object):
    def rotate(self, matrix):
    """
    :type matrix: List[List[int]]
    :rtype: None Do not return anything, modify matrix in-place instead.
    """
    matrix[::] = map(list,zip(*reversed(matrix)))
  • 49.字母异位词分组(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class Solution(object):
    def groupAnagrams(self, strs):
    """
    :type strs: List[str]
    :rtype: List[List[str]]
    """
    #方法一
    # res=[]
    # c=[]
    # result=[]
    # for i in range(len(strs)):
    # res.append((strs[i],Counter(strs[i])))
    # while len(res)!=0:
    # temp=res[0][1]
    # num=[]
    # count=[]
    # for i in range(len(res)):
    # if temp==res[i][1]:
    # num.append(res[i][0])
    # count.append(i)
    # result.append(num)
    # for i in reversed(count):
    # res.pop(i)
    # return result

    #其他解法
    res = []
    dic = {}
    for s in strs:
    keys = "".join(sorted(s))
    if keys not in dic:
    dic[keys] = [s]
    else:
    dic[keys].append(s)
    return list(dic.values())
  • 62.不同路径(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Solution(object):
    def uniquePaths(self, m, n):
    """
    :type m: int
    :type n: int
    :rtype: int
    """
    res=[[1]*n]*m
    # print(res)
    for i in range(1,m):
    for j in range(1,n):
    res[i][j]=res[i][j-1]+res[i-1][j]
    return res[-1][-1]
  • 64.最小路径和(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Solution(object):
    def minPathSum(self, grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    """
    for i in range(len(grid)):
    for j in range(len(grid[0])):
    if i == j == 0: continue
    elif i == 0: grid[i][j] = grid[i][j - 1] + grid[i][j]
    elif j == 0: grid[i][j] = grid[i - 1][j] + grid[i][j]
    else: grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j]
    return grid[-1][-1]
  • 70.爬楼梯(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Solution(object):
    def climbStairs(self, n):
    """
    :type n: int
    :rtype: int
    """
    res=[1,2,3]
    for i in range(n-3):
    res.append(res[-1]+res[-2])
    return res[n-1]
  • 75.颜色分类(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class Solution(object):
    def sortColors(self, nums):
    """
    :type nums: List[int]
    :rtype: None Do not return anything, modify nums in-place instead.
    """
    def quicksort(i,j,res):
    if i>=j:
    return res
    p = res[i]
    low = i
    high = j
    while i<j:
    while i<j and res[j]>=p:
    j-=1
    res[i]=res[j]
    while i<j and res[i]<=p:
    i+=1
    res[j]=res[i]
    res[j]=p
    quicksort(low,i-1,res)
    quicksort(i+1,high,res)
    return res
    quicksort(0,len(nums)-1,nums)


    # return nums.sort()
  • 78.子集(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Solution(object):
    def subsets(self, nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    res=[[]]
    for i in nums:
    res+=[j+[i] for j in res]
    return res
  • 94.二叉树的中序遍历(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution(object):
    def inorderTraversal(self, root):
    """
    :type root: TreeNode
    :rtype: List[int]
    """
    if root==None:
    return []
    return self.inorderTraversal(root.left)+[root.val]+self.inorderTraversal(root.right)
  • 98.验证二叉搜索树(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution(object):
    def isValidBST(self, root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    res = []
    def inorder(node):
    if node == None:
    return False
    inorder(node.left)
    res.append(node.val)
    inorder(node.right)
    inorder(root)
    # print(res)
    if sorted(list(set(res))) == res:
    return True
    else:
    return False
  • 101.对称二叉树(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Solution(object):
    def isSymmetric(self, root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    return self.ismirror(root,root)
    def ismirror(self,p,q):
    if p == None and q == None:
    return True
    if p == None or q == None:
    return False
    if p.val == q.val:
    return self.ismirror(p.left,q.right) and self.ismirror(p.right,q.left)
  • 102.二叉树的层序遍历(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Solution(object):
    def levelOrder(self, root):
    """
    :type root: TreeNode
    :rtype: List[List[int]]
    """
    if root==None:
    return []
    queue = []
    queue.append(root)
    res = []
    num=[]
    temp=[]
    while len(queue)>0:
    while len(queue)>0:
    node = queue.pop(0)
    # print(type(node))
    num.append(node.val)
    if node.left:
    temp.append(node.left)
    if node.right:
    temp.append(node.right)
    # print(type(temp[0]))
    res.append(num)
    num=[]
    for i in range(len(temp)):
    queue.append(temp[i])
    temp=[]
    # for i in temp:
    # queue.append(temp)
    # temp=[]
    return res
  • 104.二叉树的最大深度(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution(object):
    def maxDepth(self, root):
    """
    :type root: TreeNode
    :rtype: int
    """
    if not root:
    return 0
    return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
  • 105.从前序与中序遍历序列构造二叉树(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution(object):
    def buildTree(self, preorder, inorder):
    """
    :type preorder: List[int]
    :type inorder: List[int]
    :rtype: TreeNode
    """
    if not preorder:
    return None
    x = preorder[0]
    node = TreeNode(x)
    i = inorder.index(x)

    node.left = self.buildTree(preorder[1:i+1],inorder[:i])
    node.right = self.buildTree(preorder[i+1:],inorder[i+1:])
    return node
  • 114.二叉树展开为链表(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution(object):
    def flatten(self, root):
    """
    :type root: TreeNode
    :rtype: None Do not return anything, modify root in-place instead.
    """
    if root == None:
    return []
    self.flatten(root.left)
    self.flatten(root.right)
    tmp = root.right
    root.right = root.left
    root.left = None
    while(root.right != None):
    root = root.right
    root.right = tmp
  • 121.买卖股票的最佳时机(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution(object):
    def maxProfit(self, prices):
    """
    :type prices: List[int]
    :rtype: int
    """
    # max_num=0
    # if len(prices)==0:
    # return 0
    # for i in range(1,len(prices)):
    # if prices[i]-min(prices[:i])>max_num:
    # max_num = prices[i]-min(prices[:i])
    # return max_num

    max_num=0
    if len(prices)==0:
    return 0
    min_num=prices[0]
    for i in range(1,len(prices)):
    min_num = min(min_num,prices[i-1])
    if prices[i]-min_num>max_num:
    max_num = prices[i]-min_num
    return max_num
  • 128.最长连续序列(hard)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Solution(object):
    def longestConsecutive(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    if len(nums)==0:
    return 0
    nums = list(set(nums))
    nums = sorted(nums)
    # print(nums)
    res=[1]
    count=1
    for i in range(1,len(nums)):
    if nums[i]-nums[i-1]==1:
    count+=1
    else:
    res.append(count)
    count=1
    res.append(count)
    return max(res)
  • 136.只出现一次的数字(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Solution:
    def singleNumber(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    a = 0
    for num in nums:
    a = a ^ num
    return a
  • 141.环型链表(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.next = None

    class Solution(object):
    def hasCycle(self, head):
    """
    :type head: ListNode
    :rtype: bool
    """
    if head==None or head.next==None:
    return False
    p=head
    q=head.next
    while p:
    if q.next==p:
    return True
    else:
    if q.next==None:
    return False
    if q.next.next==None:
    return False
    p=p.next
    q=q.next.next
    return False
  • 142.环形链表II(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.next = None

    class Solution(object):
    def detectCycle(self, head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    res=[]
    node=head
    while node!=None:
    if node.next not in res:
    res.append(node)
    node=node.next
    else:
    return node.next
    return None
  • 148.排序链表(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, val=0, next=None):
    # self.val = val
    # self.next = next
    class Solution(object):
    def sortList(self, head):
    """
    :type head: ListNode
    :rtype: ListNode
    """

    h_head = ListNode(None) #申请头节点
    res = [] #将节点保存在列表中
    while head is not None:
    next_h = head.next
    head.next = None
    res.append(head)
    head = next_h
    # head = head.next
    res = sorted(res,key = lambda x:x.val)
    # print(res)
    n = len(res)
    if n == 0:
    return None
    h_head.next = res[0]
    for i in range(n-1):
    res[i].next = res[i+1]
    # print(res)
    return h_head.next
  • 152.乘积最大子数组(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Solution(object):
    def maxProduct(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    rev_nums = nums[::-1]
    for i in range(1,len(nums)):
    nums[i] *= nums[i-1] or 1
    rev_nums[i] *= rev_nums[i-1] or 1
    return max(max(nums),max(rev_nums))
  • 155.最小栈(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    class MinStack(object):

    def __init__(self):
    """
    initialize your data structure here.
    """
    self.l = []


    def push(self, x):
    """
    :type x: int
    :rtype: None
    """
    self.l.append(x)
    self.minnum = min(self.l)


    def pop(self):
    """
    :rtype: None
    """
    self.l.pop()
    self.minnum =not self.l or min(self.l)


    def top(self):
    """
    :rtype: int
    """
    return self.l[-1]


    def getMin(self):
    """
    :rtype: int
    """
    return self.minnum



    # Your MinStack object will be instantiated and called as such:
    # obj = MinStack()
    # obj.push(x)
    # obj.pop()
    # param_3 = obj.top()
    # param_4 = obj.getMin()
  • 160.相交链表(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.next = None

    class Solution(object):
    def getIntersectionNode(self, headA, headB):
    """
    :type head1, head1: ListNode
    :rtype: ListNode
    """
    l1=0
    l2=0
    node1=headA
    node2=headB
    while headA: #求第一个链表长度
    l1+=1
    headA=headA.next
    while headB: #求第二个链表长度
    l2+=1
    headB=headB.next
    s=l1-l2
    while s>0: #对齐两个链表长度
    node1=node1.next
    s-=1
    while s<0:
    node2=node2.next
    s+=1
    while node1 and node2:
    if node1==node2:
    return node1
    node1=node1.next
    node2=node2.next
    return None
    # while node1!=node2: #从头开始判断地址是否相同
    # node1=node1.next
    # node2=node2.next
    # return node1
  • 169.多数元素(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    class Solution(object):
    def majorityElement(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    res = sorted(nums)
    return res[(len(nums)//2)]
  • 206.反转链表(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.next = None

    class Solution(object):
    def reverseList(self, head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    # if head:
    # pre=head
    # q=head.next
    # while pre.next:
    # pre.next=q.next
    # q.next=head
    # head=q
    # q=pre.next
    # return head
    if head==None or head.next==None:
    return head
    pre=head
    q=head.next
    while pre.next:
    pre.next=q.next
    q.next=head
    head=q
    q=pre.next
    return head
  • 215.数组中的第K个最大元素(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Solution(object):
    def findKthLargest(self, nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    s = sorted(nums,reverse=True)
    return s[k-1]
  • 226.翻转二叉树(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Solution(object):
    def invertTree(self, root):
    """
    :type root: TreeNode
    :rtype: TreeNode
    """
    if root == None:
    return root
    temp = root.left
    root.left = root.right
    root.right = temp
    root.left = self.invertTree(root.left)
    root.right = self.invertTree(root.right)
    return root
  • 234.回文链表(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    # Definition for singly-linked list.
    # class ListNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.next = None

    class Solution(object):
    def isPalindrome(self, head):
    """
    :type head: ListNode
    :rtype: bool
    """
    #第一种思路
    #再创建一个链表与head相反,然后逐个对比
    #超时 失败
    #第二种思路
    #用list存下链表所有值,逐个对比
    #超时 失败
    if head==None or head.next==None:
    return True
    if head!=None and head.next!=None and head.next.next==None:
    if head.val==head.next.val:
    return True
    else:
    return False
    c=[]
    pre=head
    while pre:
    c.append(pre.val)
    pre=pre.next
    i=0
    j=-1
    for i in range(len(c)/2):
    if c[i]!=c[j]:
    return False
    j-=1
    return True
    # if head==None or head.next==None:
    # return True
    # if head!=None and head.next!=None and head.next.next==None:
    # if head.val==head.next.val:
    # return True
    # else:
    # return False
    # pre=head
    # node=None
    # node_head=None
    # while pre:
    # node_head=ListNode(pre.val)
    # node_head.next=node
    # node=node_head
    # pre=pre.next
    # while node_head and head:
    # if node_head.val!=head.val:
    # return False
    # return True
  • 238.除自身以外数组的乘积(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution(object):
    def productExceptSelf(self, nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    res=[]
    res1=[1 for i in range(len(nums))]
    res2 = [1 for i in range(len(nums))]
    for i in range(1,len(nums)):
    res1[i]=nums[i-1]*res1[i-1]
    for j in range(len(nums)-2,-1,-1):
    res2[j]=nums[j+1]*res2[j+1]
    for i in range(len(res1)):
    res.append(res1[i]*res2[i])
    return res
    # print(res)
    # for i in range(len(nums)):
    # for j in range(i):
    # res[i]*=nums[j]
    # for k in range(i+1,len(nums)):
    # res[i]*=nums[k]
    # return res
  • 279.完全平方数(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Solution(object):
    def numSquares(self, n):
    """
    :type n: int
    :rtype: int
    """
    #n = (4^a)*(8b+7) return 4
    while n%4==0:
    n/=4
    if n%8==7:
    return 4
    a=0
    #n=a**2 + b**2 return 1 or 2
    while a**2 <=n:
    b= int((n-a**2)**0.5)
    if a**2 + b**2 == n:
    if a>0:
    a=1
    if b>0:
    b=1
    return a+b
    a+=1
    return 3
  • 283.移动零(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Solution(object):
    def moveZeroes(self, nums):
    """
    :type nums: List[int]
    :rtype: None Do not return anything, modify nums in-place instead.
    """
    for i in nums:
    if i==0:
    nums.insert(len(nums),0)
    nums.remove(i)
    return nums
  • 287.寻找重复数(medium)

    1
    2
    3
    4
    5
    6
    class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
    s= sorted(nums)
    for i in range(len(s)-1):
    if not s[i]^s[i+1]:
    return s[i+1]
  • 297.二叉树的序列化与反序列化(hard)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Codec:

    def serialize(self, root):
    """Encodes a tree to a single string.

    :type root: TreeNode
    :rtype: str
    """
    def dfs(root):
    if not root:
    return 'null '
    left = dfs(root.left)
    right = dfs(root.right)
    return str(root.val)+' '+left+right
    return dfs(root)


    def deserialize(self, data):
    """Decodes your encoded data to tree.

    :type data: str
    :rtype: TreeNode
    """
    def dfs(data):
    val = data.pop(0)

    if val == 'null':
    return None

    node = TreeNode(val)
    node.left = dfs(data)
    node.right = dfs(data)

    return node

    # print(data)
    dataList = data.split(' ')
    # print(dataList)
    return dfs(dataList)

    # Your Codec object will be instantiated and called as such:
    # ser = Codec()
    # deser = Codec()
    # ans = deser.deserialize(ser.serialize(root))
  • 347.前K个高频元素(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution(object):
    def topKFrequent(self, nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: List[int]
    """
    res = []
    for i in Counter(nums).most_common(k):
    res.append(i[0])
    return res
    # res = Counter(nums)
    # result = []
    # for i in res.most_common(k):
    # result.append(i[0])
    # return result
  • 394.字符串解码(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Solution(object):
    def decodeString(self, s):
    """
    :type s: str
    :rtype: str
    """
    stack = []
    num = 0
    res = ""
    for c in s :
    if c.isdigit():
    num = num*10+int(c)
    elif c == "[":
    stack.append((res,num))
    res = ""
    num = 0
    elif c == "]":
    top = stack.pop()
    res = top[0]+res*top[1]
    else:
    res += c
    return res
  • 448.找到所有数组中消失的数字(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Solution(object):
    def findDisappearedNumbers(self, nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    # if len(nums)==0:
    # return []
    # max_n = len(nums)
    # s = set([i for i in range(1, max_n+1)])
    # s = s.difference(set(nums))
    # return list(s)
    # c=[]
    c=set(nums)
    d=set()
    for i in range(1,len(nums)+1):
    d.add(i)
    result = d.difference(c)

    return list(result)
  • 461.汉明距离(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Solution(object):
    def hammingDistance(self, x, y):
    """
    :type x: int
    :type y: int
    :rtype: int
    """
    count = 0
    a=bin(x)[2:]
    b=bin(y)[2:]
    if len(a)>len(b):
    for i in range(len(a)-len(b)):
    b = "0"+b
    elif len(a)<len(b):
    for i in range(len(b)-len(a)):
    a = "0"+a
    for i in range(len(a)):
    if a[i]!=b[i]:
    count+=1
    return count
  • 560.和为K的子数组(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Solution(object):
    def subarraySum(self, nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    m={0:1}
    sumN=0
    count=0
    for i in range(len(nums)):
    sumN+=nums[i]
    count+=m.get(sumN-k,0)
    m[sumN]=m.get(sumN,0)+1
    return count
  • 617.合并二叉树(easy)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # Definition for a binary tree node.
    # class TreeNode(object):
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    class Solution(object):
    def mergeTrees(self, t1, t2):
    """
    :type t1: TreeNode
    :type t2: TreeNode
    :rtype: TreeNode
    """
    if t1 and t2:
    t1.val +=t2.val
    t1.left = self.mergeTrees(t1.left,t2.left)
    t1.right = self.mergeTrees(t1.right,t2.right)
    return t1
    return t1 or t2
  • 647.回文子串(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Solution(object):
    def countSubstrings(self, s):
    """
    :type s: str
    :rtype: int
    """
    # int count = len(s)
    count = 0
    for j in range(1,len(s)+1):
    i=0
    k=j
    while k<=len(s):
    t=s[i:k]
    if t==t[::-1]:
    count+=1
    i+=1
    k+=1
    return count
  • 739.每日温度(medium)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution(object):
    def dailyTemperatures(self, T):
    """
    :type T: List[int]
    :rtype: List[int]
    """
    res=[0 for _ in range(len(T))]
    stack=[]
    # print(s)
    for k,v in enumerate(T):
    if stack:
    while stack and T[stack[-1]] < v:
    res[stack[-1]] = k - stack[-1]
    stack.pop()
    stack.append(k)
    return res