剑指offer64、32、35、40 数组

64、滑动窗口的最大值

在这里插入图片描述
这题先进先出,后进后出,一看就用到队列。
在这里插入图片描述

# -*- coding:utf-8 -*-
class Solution:
    def maxInWindows(self, num, size):
        # write code here
        if size>len(num):
            return []
        if size == 0:
            return []
        res = []
        count = 0
        # 队列
        queue = num[:size]
        res.append(max(queue))
        while size+count < len(num):
            queue.pop(0)
            queue.append(num[size+count])
            count+=1
            res.append(max(queue))
        return res

32、把数组排成最小的数

在这里插入图片描述
思路:先将数组中每个元素转换成String类型,然后进行排序,如果str(a) + str(b) > str(b) + str(a),说明ab > ba,应该把b排在a前面。使用冒泡排序编写程序如下:

# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        n = len(numbers)
        for i in range(n):
            for j in range(i+1, n):
                if int(str(numbers[i])+str(numbers[j])) > int(str(numbers[j])+str(numbers[i])):
                    numbers[j],numbers[i] = numbers[i],numbers[j]
        return ''.join([str(i) for i in numbers])

35、数组中的逆序对

在这里插入图片描述
在这里插入图片描述
归并排序固定写法可以看这里

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        # 第一反应是冒泡排序swap次数即逆序对个数,但复杂度高
        # 所以使用归并排序,比较时计算逆序对个数
        self.count = 0

        def merge_sort(lists):
            if len(lists) <= 1:
                return lists
            mid = len(lists) // 2
            left = merge_sort(lists[:mid])
            right = merge_sort(lists[mid:])
            return merge(left, right)
        
        def merge(nums1, nums2):
            res = []
            i = 0
            j = 0
            while i < len(nums1) and j < len(nums2):
                if nums1[i] <= nums2[j]:
                    res.append(nums1[i])
                    i += 1
                else:
                    res.append(nums2[j])
                    j += 1
                    self.count += len(nums1) - i  # 这里是最重要的一处
            res += nums1[i:]
            res += nums2[j:]
            return res

        merge_sort(data)
        return self.count%1000000007

40、数组中只出现一次的数字

在这里插入图片描述
遍历数组,对每个元素直接利用python数组的count函数,因为count()也是,等价于遍历数组再计数,所以时间复杂度为,

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        num = []
        for i in range(len(array)):
            if array.count(array[i]) == 1:
                num.append(array[i])
        return num
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页