题目1

给定一个整型数组arr,  打印其中出现次数大于一半的数, 如果没有这样的数,打印提示信息

进阶

给定一个整型数组arr, 再给定一个整数K, 打印所有出现次数大于 N/K的数,如果没有这样的数字,打印提示信息

题目的思路是:

一般都思路是 哈希表记录每个数跟出现的次数,但是额外空间复杂度是O(N)

现在提供一个方法,核心思想是:

一次在数组中删掉K个不同的数,不停的删除,知道剩下的数种类不足K就停止删除, 那么,如果在数组中出现的次数大于 N/K, 则这个数最后一定会被剩下

说白了就是:数组,与次数有关的 可以使用删除法 。 类似于 拿着相同的数去干掉不同的,剩下的就是阵容强大的那一组。

在删除时候使用的策略是,记录当前位置的数,遍历下一个,如果不一致那就可以ko掉一个。

题目1 : 每次一次在数组中删掉两个不同的数,不停的删除,直到剩下的数只有一种。   一个干一个,一个干掉一个(逻辑干掉,time的减少。当前的和下一个去抵消,最后看看剩下个啥子)

package TT;

public class Test66 {

     public static void printHalfMajor(int[] arr){

         int cand = 0;
int times = 0; for(int i = 0; i!=arr.length; i++){
if(times ==0){
cand = arr[i];
times = 1;
}else if(arr[i]== cand){
times++;
}else{
times--;
} }
times = 0;
for(int i =0; i!=arr.length; i++){
if(arr[i] == cand){
times++;
} }
if(times > arr.length/2){
System.out.println(cand);
}else {
System.out.println("no such number");
} } public static void main(String[] args){ int[] arr = new int[6];
arr[0]=2;
arr[1]=1;
arr[2]=2;
arr[3]=4;
arr[4]=2;
arr[5]=2; printHalfMajor(arr); } }

我再用比较繁琐一些,容易理解上一些。核心的思想: 拿出record去一直做pk,一直pk的条件是times这个能量值不为0。 

如果record为0,那么下台,换一个,从新去跟后面pk。

public class Test8 {
public static Integer getNumOverHalf(int[] arr){
if (arr.length<=2 && arr.length%2 !=0){
throw new RuntimeException("长度不够!") ;
}
int times = 0 ; //剩下的数量
int record= 0;
for (int i=0; i<arr.length; i++){
if (times==0){ //如果剩余量为0 那么记录下当前的 然后继续加
record=arr[i];
times = 1;
} else if (arr[i]!= record){
times--;
}else if (arr[i]==record){
times++;
}
}
times=0;
for (int i=0; i<arr.length; i++){
if (arr[i]==record){
times++;
}
}
if (times == (arr.length/2)){
return record;
}else {
System.out.println("没有!");
return null;
}
}
public static void main(String[] args) {
int[] arr = {1,2,4,3,4,4};
System.out.println(getNumOverHalf(arr));
}
}

数组,与次数有关的 可以使用删除法 。 类似于 拿着相同的数(record下来的)去干掉不同的,剩下的(record下来的)就是阵容强大。 然后统计下留下的这个(占有量做多的),再去遍历数组进行检验。就OK了

算法总结之 在数组中找到出现次数 > N/K的数的更多相关文章

  1. 《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于N/K 的数

    题目 在数组中找到出现次数大于N/K 的数 java代码 package com.lizhouwei.chapter8; import java.util.ArrayList; import java ...

  2. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

  3. 编程算法 - 数字在排序数组中出现的次数 代码(C)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/36869869 数字在排序数组中出现的次数 代 ...

  4. [算法]在数组中找到出现次数大于N/K的数

    题目: 1.给定一个整型数组,打印其中出现次数大于一半的数.如果没有出现这样的数,打印提示信息. 如:1,2,1输出1.    1,2,3输出no such number. 2.给定一个整型数组,再给 ...

  5. 在未排序的数组中找到第 k 个最大的元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  6. 【C语言】在两个数成对出现的数组中找到一个单独的数。

    //在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) ...

  7. 【一起刷LeetCode】在未排序的数组中找到第 k 个最大的元素

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  8. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  9. [PHP] 算法-统计一个数字在排序数组中出现的次数的PHP实现

    统计一个数字在排序数组中出现的次数. 1.有序的数组查找,使用二分法 2.二分法查找第一次出现的位置,二分法查找最后一次出现的位置,end - start +1 left=getLeft(data,k ...

随机推荐

  1. nginx访问css js 图片等静态资源,报404或无法定向访问到

    配置完nginx,把php的项目放上去后,发现css,js和图片全部访问不到,一直重定向到根目录执行index.php,郁闷的在网上查了半天,原来不同后缀名的文件访问时都要在nginx.conf中声明 ...

  2. 服务器之ipmitool

    一般命令 raw #发送一个原始的IPMI请求,并且打印回复信息. Lan #配置网络(lan)信道(channel) chassis #查看底盘的状态和设置电源 event #向BMC发送一个已经定 ...

  3. 集合遍历的时候删除List

    在Java中有时候我们会需要对List里面的符合某种业务的数据进行删除,但是如果不了解里面的机制就容易掉入“陷阱”导致遗漏或者程序异常.本文以代码例子的方式进行说明该问题. 1.采用索引下标遍历的方式 ...

  4. C#实体类序列化为XML

    这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ...

  5. docker related,docker history

    History of an image and size of layers: docker history --no-trunc=true zabbix/zabbix-3.0 | tr -s ' ' ...

  6. <2013 08 17> BucketList of girlfriend

    BucketList of girlfriend 1.出国旅游 2.跟相爱的人结婚,生个健康可爱的孩子 3.说一口流利的英语 4.学素描和水彩 5.买个雅马哈钢琴,偶尔学着弹一首曲子 6.把泪腺堵住 ...

  7. 为什么调用 GdiplusShutdown 函数会在 DllExports::GdipDeleteGraphics(nativeGraphics) 位置抛出异常?

    因为没有仔细看文档 https://docs.microsoft.com/en-us/windows/desktop/api/Gdiplusinit/nf-gdiplusinit-gdiplusshu ...

  8. MySQL复制(二):二进制日志、二进制日志的结构和内容

    通常只有即将执行完毕的语句才会写入到二进制日志中.但是一些特殊情况:语句附加的信息或直接代替语句被写入. 二进制日志记录的内容 作用:记录数据库中表的更变,用于复制和PITP(即时恢复) 基于语句SB ...

  9. 父标签浮动(float)“塌陷”问题

    浮动“塌陷” float参见: http://www.cnblogs.com/bigtreei/p/8110090.html http://www.w3school.com.cn/css/css_po ...

  10. 003-搭建框架-实现IOC机制

    一.实现目标 一种MVC[Model-View-Controller]一种设计模式,进行解耦. /* * 处理客户管理相关请求 */ @Controller public class Customer ...