剑指offer 19-1020

数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

  • 归并排序的思路(添加count进行计数即可)
count = 0
class Solution:
    def InversePairs(self, data):
        global count
        def MergeSort(lists):
            global count
            if len(lists) <= 1:
                return lists
            num = int( len(lists)/2 )
            left = MergeSort(lists[:num])
            right = MergeSort(lists[num:])
            r, l=0, 0
            result=[]
            while l<len(left) and r<len(right):
                if left[l] < right[r]:
                    result.append(left[l])
                    l += 1
                else:
                    result.append(right[r])
                    r += 1
                    count += len(left)-l
            result += right[r:]
            result += left[l:]
            return result
        MergeSort(data)
        return count%1000000007

两个列表的第一个公共节点

输入两个链表,找出它们的第一个公共结点。

  • 找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走
    (因为2个链表用公共的尾部)
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        l1,l2=0,0
        p1,p2=pHead1,pHead2
        while p1:
            p1=p1.next
            l1+=1
        while p2:
            p2=p2.next
            l2+=1
        s=l1-l2
        if s>=0:
            while s:
                pHead1=pHead1.next
                s-=1
        else:
            s=-s
            while s:
                pHead2=pHead2.next
                s-=1
        while pHead1 != pHead2:
            pHead1=pHead1.next
            pHead2=pHead2.next
        return pHead1

数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。

  • 类似于二分查找
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        mid=len(data)//2
        if len(data)<1:
            return 0
        count=1
        if data[mid]==k:
            for i in range(mid-1,-1,-1):
                if data[i]!=k:
                    break
                count+=1
            for i in range(mid+1,len(data)):
                if data[i]!=k:
                    break
                count+=1
            return count
        if data[mid]<k:
            self.GetNumberOfK(data[mid+1:],k)
        else:
            self.GetNumberOfK(data[:mid],k)
        return 0

二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

  • 利用一个队列进行层次遍历,直到队列为空即可
class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if not pRoot:
            return 0
        queue=[]
        queue.append(pRoot)
        count=0
        while queue:
            length=len(queue)
            for i in range(length):
                r=queue.pop(0)
                if r.left:
                    queue.append(r.left)
                if r.right:
                    queue.append(r.right)
            count+=1
        return count
# 递归版 类似于动态规划
class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if not pRoot:
            return 0
        count=max(self.TreeDepth(pRoot.left),self.TreeDepth(pRoot.right))+1
        return count

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n=0
        for i in range(len(nums)):
            n=nums[i]^n
        return n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值