给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息。

===

核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如果一个数在数组中出现的次数大于N/K,则这个数最后一定会被剩下来。

解法:设立(K-1)个候选cand,以及(K-1)个times统计。

过程如下:

  遍历到arr[i]时,看arr[i]是否与以及被选出来的某一个候选相同,

    如果与某一个候选相同,就把属于那个候选的点数统计加1,

    如果与所有的候选都不相同

      先看当前的候选是否选满了,选了k-1个,就是满;否则就是没有选满

      如果不满,把arr[i]作为一个新的候选,属于它的点数初始化为1

      如果已满,说明此时发现了k个不同的数,arr[i]就是第k个。此时把每一个候选各自的点数全部减1,表示每个候选“付出”一个自己的点数。如果某些候选的点数在减一之后等于0,则还需要把这些候选cond[...]删除,候选又变为不满的状态。

在上述过程结束后,还需要再遍历一次,验证被选出来的所有候选有哪些出现次数真的大于N/K,符合条件的候选就打印。

229. Majority Element II

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

代码在这里,

但是在leetcode上提交由runtime error,我没有发现什么问题。

 class A{
public:
vector<int> majorityElement(vector<int>& nums) {
int n = nums.size();
unordered_map<int,int> candTimes;
vector<int> re;
for(int i = ;i<n;i++){
if(candTimes.find(nums[i])!=candTimes.end()){
candTimes[nums[i]]++;
}else{
if(candTimes.size()<){
candTimes[nums[i]]++;
}else if(candTimes.size()==){
for(unordered_map<int,int>::iterator mit = candTimes.begin();
mit!=candTimes.end();mit++){
if(mit->second==){
candTimes.erase(mit);
}else{
mit->second--;
}
}
}
}///if-else
}///for ///verify the solution
for(unordered_map<int,int>::iterator mit = candTimes.begin();
mit!=candTimes.end();mit++){
mit->second = ;
} for(int i = ;i<n;i++){
if(candTimes.find(nums[i])!=candTimes.end()){
candTimes[nums[i]]++;
}
} for(unordered_map<int,int>::iterator mit = candTimes.begin();
mit!=candTimes.end();mit++){
if(mit->second>(n/)){
re.push_back(mit->first);
}
}
return re;
}
};

最新文章

  1. 你所能用到的BMP格式介绍
  2. BZOJ 1226: [SDOI2009]学校食堂Dining
  3. 实战MEF(1):一种不错的扩展方式
  4. springmvc参数绑定
  5. html5压缩图片并上传
  6. URL详谈
  7. Delphi遍历文件夹
  8. 【python】网络爬虫抓取图片
  9. c++ 函数返回指针 及用法
  10. JavaEE参考示例 SpringSide 4.0 GA版杀青
  11. Js原型模式
  12. NDK开发之访问域
  13. bzoj1297
  14. gulp多张图片自动合成雪碧图
  15. QT自定义控件插件化简要概述
  16. 认识scrapy
  17. 树莓派做coolpy服务器
  18. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
  19. iOS开发-NSUndoManager撤销(undo)和重做(redo)
  20. C#配置.INI文件

热门文章

  1. OpenCV转为灰度图像 &amp; 访问像素方法
  2. 机器学习-octave使用
  3. Python基础总结与实践
  4. python时间转换 ticks-FYI
  5. python_7_while
  6. 函数指针 &amp;&amp; 指针函数
  7. PHP开发框架流行度排名:Laravel居首
  8. IOS后台执行
  9. API调用微信getWXACodeUnlimit()获取小程序码
  10. JS中的引用、浅拷贝和深拷贝