剑指offer 19、28、29、30

19、顺时针打印矩阵在这里插入图片描述

在这里插入图片描述

思路:定义四个变量,表示左上和右下的打印范围,一次旋转打印结束后,往对角分别前进和后退一个单位。

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
    # write code here
        rows=len(matrix)
        cols=len(matrix[0])
        result=[]
        if rows==0 and cols==0:
            return result
        left,right,top,bottom = 0,cols-1,0,rows-1

        while left<=right and top<=bottom:
            for i in range(left,right+1):
                result.append(matrix[top][i])
            for i in range(top+1,bottom+1):
                result.append(matrix[i][right])
            if top!=bottom:
                for i in range(right-1,left-1,-1):
                    result.append(matrix[bottom][i])
            if left!=right:
                for i in range(bottom-1,top,-1):
                    result.append(matrix[i][left])
            left+=1
            right-=1
            top+=1
            bottom-=1
        return result

28、数组中出现次数超过一半的数字

在这里插入图片描述
这个想法超级巧妙:
思路1:对该数组进行排序,找数组中间的数。再判断中间的数的值是否>长度/2

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        numbers.sort()
        theone = numbers[len(numbers)/2]
        if numbers.count(theone)>len(numbers)/2:
            return theone
        return 0

29、最小的K个数

在这里插入图片描述

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if tinput == [] or k > len(tinput):
            return []
        tinput.sort()
        return tinput[: k]

30、连续子数组的最大和

状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]
dp[i] / dp[i][j] 代表什么意思?
找到 dp[i] / dp[i][j] 与前一项的关系式
确定初始值

# -*- coding:utf-8 -*-
class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        dp = [0 for i in range(len(array))]
        
        for i in range(len(array)):
            dp[i] = max(dp[i-1], 0) + array[i]
        
        return max(dp)
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页