剑指offer--13

作者: strive鱼 | 来源:发表于2018-05-28 17:03 被阅读0次

进入本章节后,题目开始更多的关注时间和空间两者的转换
题26--数组中数值出现次数超过一半的数

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

本题常规的思路就是对数组首先进行排序,然后再找出超过数组长度一半的数,但这种思路往往比较平淡,本次采用O(n)的思路来解答本题

class solution(object):
    def match(self,result,length,numbers):
        count=0
        for i in  range(length):
            if numbers[i]==result:
                count+=1
        if count*2<=length:
            return False
        return True
    def search_number(self,numbers):
        length=len(numbers)
        if numbers==None or length<=0:
            return None 
        times=1#先初始化计数
        result=numbers[0]
        for i in range(1,length):
            if times==0:
                result=numbers[i]
                times=1
            elif numbers[i]==result:
                times+=1
            else:
                times-=1
        if not self.match(result,length,numbers):
            return 0
        return result
    
    
    
def main():
    s=solution()
    print (s.search_number([1,2,3,2,2,2,4,5,2]))
    


if __name__=='__main__':
    main()

题27--输出最小的k个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

本题也有两种思路,第一种思路就是基于要找的最小k个数,首先以数组中的该位置的值为分界点,把比它小的数放在左边,把比它大的数放在右边,那么最小的k个数即是包含k在内的k个数,时间复杂度为O(nlogk)

另外一种思路适合海量的数据源,它会用到堆(heapq)的相关概念,关于python 中heapq模块的介绍如下:

image.png

常用语法如下:


image.png

关于本题的思路书中是这么说的


image.png

import heapq#输出该模块


class solution(object):
    def k_search(self,tinput,k):#两个变量,一个最初的数组,一个需要输出k个最小值
        if tinput==None or len(tinput)<k or k<=0:
            return None 
        output=[]#重新建立的一个数组
        for i in tinput:
            if len(output)<k:
                output.append(i)
            else:
                output=heapq.nlargest(k,output)#利用堆得到k个最大值,这k个最大值由大到小排列
                if i>=output[0]:#表明该循环值大于目前堆中的最大值,因此,不用替换,直接进行下次循环
                     continue
                output[0]==i#不然的话就将该值与最大值替换
        return output[::-1]#堆逆序,即由小到大排列
    
    
 

def main():
    s=solution()
    print (s.k_search([4,5,1,6,2.7,3,8],4)
    







if __name__=='__main__':
    main()

相关文章

  • 剑指offer--13

    进入本章节后,题目开始更多的关注时间和空间两者的转换题26--数组中数值出现次数超过一半的数 本题常规的思路就是对...

  • 剑指

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

  • 剑指

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

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

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

  • 剑指offer

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

  • 剑指BAT

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

  • 《剑指offer》

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

  • 气剑指

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

  • 剑指offer

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

  • 剑指苍穹

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

网友评论

    本文标题:剑指offer--13

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