美文网首页
剑指offer--algorithm14

剑指offer--algorithm14

作者: strive鱼 | 来源:发表于2018-05-30 11:23 被阅读0次

题28--连续子数组的最大和

输入一个整型数组,数组里有整数也有负数。
数组中一二或连续的多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)

本题需要注意一点就是连续,而不是随机从数组中选取几个数来进行累加
书中介绍了两种解题的思路,第一种是通过举例来得到其中的规律,书中举例的数组为[1,-2,3,10,-4,7,2,5]

image.png
image.png

下面是本题的程序

"""
本题的for 循环短小精悍,却十分的巧妙
"""

class solution(object):
    def ngreatest(self,array):
        if array==None or len(array)==0:
            return None 
        cum=0#初始化一个值,用于跟踪叠加后的值的正负状况
        ncount=array[0]#用于存储连续数组的和的最大值
        for i in range(len(array)):
            if cum<=0:
                cum=array[i]#注意循环的结构,非[i+1]
            else:
                cum+=array[i]#注意这里也非[i+1]
            if cum>ncount:
                ncount=cum
        return ncount 
    
        




def main():
    s=solution()
    print (s.ngreatest([1,-2,3,10,-4,7,2,5]))
    
    
    
if __name__=='__main__':
     main()

第二种方法巧妙的应用了动态规划法,来处理此问题,该方法的思路解析如下


image.png

下面为该方法的程序和注释

class solution(object):
    def ngreatest(self,array):
        if array==None or len(array)==0:
            return None 
        storage_array=[0]*len(array)#该数组的作用是存储累加的数字,以【1,-2,3,10,-4,7,2,5】为例,那么存储的东西为[1,-1,3,13......]
        for i in range(len(array)):
            if i==0 or storage_array[i-1]<=0:
                storage_array[i]=array[i]
            else:
                storage_array[i]=storage_array[i-1]+array[i]
        return max(storage_array)



def main():
    s=solution()
    print (s.ngreatest([1,-2,3,10,-4,7,2,5]))
    
    
    
if __name__=='__main__':
    main()

题29--把数组排成最小的数

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

本题其实就是一个排序题

"""
首先注意字符串的一个比较
其次注意冒泡算法
"""


class solution(object):
    def sorted_num(self,array):
        if array==None or len(array)<=0:
            return None 
        strnum=[str(m) for m in array]
        """"
        下面使用冒泡算法排序
        """
        for i in range(1,len(strnum)):
            for j in range(0,len(strnum)-i):
                if strnum[j]+strnum[j+1]>strnum[j+1]+strnum[j]:
                    strnum[j],strnum[j+1]=strnum[j+1],strnum[j]
        return ''.join(strnum)
    
    
    
    
    
def main():
    s=solution()
    print (s.sorted_num([23,15,42]))
    
    
    
    
    
if __name__=='__main__':
    main()

相关文章

  • 剑指offer--algorithm14

    题28--连续子数组的最大和 本题需要注意一点就是连续,而不是随机从数组中选取几个数来进行累加书中介绍了两种解题的...

  • 剑指

    遥望中原九点烟,风云直上七重天。 今朝再向江湖去,一剑流星谁比肩? 2011.10(1488)

  • 剑指

    1. 二维数组中查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照...

  • 全网最全剑指offer题目解答

    【剑指offer】Java版代码(完整版) 【剑指offer】1-10题 【剑指offer】11-20题 【剑指o...

  • 剑指offer

    第一题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,...

  • 剑指BAT

    Android工作5年半了,一毕业就开始做这行。在现在这家公司工作了3年整,最近有换工作的打算,所以在猎聘...

  • 《剑指offer》

    4.调整数组顺序使奇数位于偶数前面 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇...

  • 气剑指

    “聚气于指尖,凝其成剑,利可断金。”牢头对身边的狱卒说。 只见牢头举起的右手指尖逐渐变红,转而变白,隐隐发出音量很...

  • 剑指offer

    二维数组中查找数在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到...

  • 剑指苍穹

    逆天命,斩苍穹,吾乃修士,率性而为!《剑指苍穹》是一款逍遥仙侠MMORPG——群魔阻道,斩群魔;妖邪拦路,诛妖邪,...

网友评论

      本文标题:剑指offer--algorithm14

      本文链接:https://www.haomeiwen.com/subject/qhegjftx.html