程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

剑指offer.数组中出现次数超过一半的数字、在数组中找到出现次数大于n/k的数

发布于2020-02-24 23:32     阅读(1115)     评论(0)     点赞(10)     收藏(5)


题目一

题目描述

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

解题思路

思路一:基于快排思想

思路二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。

在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。

代码实现

思路二:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def MoreThanHalfNum_Solution(self, numbers):
  4. # write code here
  5. if not numbers:
  6. return 0
  7. res = 0
  8. times = 0
  9. for i, num in enumerate(numbers):
  10. if times == 0:
  11. res = num
  12. times = 1
  13. elif num == res:
  14. times += 1
  15. else:
  16. times -= 1
  17. print times
  18. return res if numbers.count(res) > len(numbers)//2 else 0

题目二

题目描述

给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于n/k的数,如果没有这样的数,请打印”-1“。

题目来源:https://www.nowcoder.com/practice/4d448650c0324df08c40c614226026ad?tpId=101&tqId=33223&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

解题思路

一次在数组中删掉k个不同的数,不停地删除,直到剩下的数的种类不足k就停止删除,那么一个数如果在数组中出现的次数大于n/k,则最后这个数一定会剩下来。

对于上一题,一次在数组中删掉两个不同的数,不停地删除,直到剩下的数只有一种,如果一个数出现的次数大于n/2,那么这个数一定是最后剩下来的一种数。

上一题的解决办法是,有一个候选数res,以及这个候选的times统计,那么这道题需要k-1个候选和k-1个times统计即可

1、候选表 HashMap:key为(K - 1)个候选 candiate,value 为它们分别出现的次数;

2、遍历到 arr[i] 时,看 arr[i] 是否在候选人中,如果与某一个候选人相同,就把属于那个候选的点数统计加 1,如果与所有的候选都不相同,先看当前的候选是否选满了,候选表中的大小为 K - 1 个,就是满了;否则就是没有选满。

2.1、如果不满,则把 arr[i] 作为一个新的候选,属于它的点数初始化为 1;
2.2、如果已满,说明此时发现了 k 个不同的数,arr[i] 就是第 k 个。此时把每一个候选各自的点数全部减 1,表示每个候选“付出”一个自己的点数,当前数也不要。如果某些候选的点数在减 1 之后等于 0,则还需要把这些候选人从候选表中删除,候选又变为不满的状态。
在上述过程结束后,还需要再遍历一次,验证被选出来的所有候选有哪些出现次数真的大于 N / K。

代码实现

  1. n, k = map(int, input().split())
  2. arr = list(map(int, input().split()))
  3. a = []
  4. d = {}
  5. def minusOne(d):
  6. temp = []
  7. for key, v in d.items():
  8. if v == 1:
  9. temp.append(key)
  10. else:
  11. d[key] = v - 1
  12. for i in temp:
  13. d.pop(i)
  14. for i in arr:
  15. if i in d:
  16. d[i] += 1
  17. else:
  18. if len(d) == k - 1:
  19. minusOne(d)
  20. else:
  21. d[i] = 1
  22. real = {}
  23. for i in arr:
  24. if i in d:
  25. real[i] = real.get(i, 0) + 1
  26. for key in d.keys():
  27. if real[key] > n / k:
  28. a.append(key)
  29. if len(a) == 0:
  30. print('-1')
  31. else:
  32. print(' '.join(map(str, [i for i in a])))

 

 

发布了240 篇原创文章 · 获赞 6 · 访问量 7070


所属网站分类: 技术文章 > 博客

作者:我下面给你吃

链接:https://www.pythonheidong.com/blog/article/232774/fb17efeedd0728cd3de7/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)