一个含N个整数的数组,其中一个元素出现次数 k>N/2,找出这个元素。限O(N)时间,O(1)空间。其实就是找数组中出现次数最多的那个元素,看到一篇帖子,调试了一把发现有问题,
http://hi.baidu.com/wzfxyer/blog/item/a16bec99e6b7700f6f068c69.html
public class FindKinN {
public static void main(String[] args) {
int[] a = {1,1,1,1,2,2,1,1,2,2,2,1};
int count,cur,n;
count = 0;
cur = 0;
n = a.length;
for (int i = 0; i < n; i++)
{
if (count == 0) cur = a[i];
if (cur == a[i])
count++;
else
count--;
}
System.out.println("你要找的是:" + cur);
}
}
//适用范围:必须有支配者,而且必须大于n/2。
调试了一把,发现算法有问题,修改如下:
public class FindKinN {
public static void main(String[] args) {
int[] a = { 4, 3, -1, 3, 4, 3, 5 };
int count, cur, n;
count = 0;
cur = a[0];
n = a.length;
for (int i = 0; i < n; i++) {
if (cur == a[i])
count++;
else {
count--;
if (count == 0){
cur = a[i];
}
}
}
System.out.println("你要找的是:" + cur);
}
}
到底对不对心里没有底,请高手帮忙分析一下。
我也感觉不对,因为我想在count--之后才能变成0,故可能前面不用判断了,我再加上,再看看有什么问题。
public class FindKinN {
public static void main(String[] args) {
int[] a = {4,3,-1,3,4,3,5,4,4,4,4,4,4};
int count, cur, n;
count = 0;
cur = a[0];
n = a.length;
for (int i = 0; i < n; i++) {
if (count == 0){
cur = a[i];
}
if (cur == a[i])
count++;
else {
count--;
if (count == 0){
cur = a[i];
}
}
}
System.out.println("你要找的是:" + cur);
}
}
我实现了一个很笨的算法,无论是时间复杂度还是空间复杂度都超了,希望谁给我改正一下:
import java.util.HashMap;
import java.util.Map;
public class FindKinN {
public static void main(String[] args) {
int[] array = {3,4,3,2,-1,3,3};
System.out.println(search(array));
}
public static int search(int[] array){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i =0; i < array.length; i++){
Integer value = map.get(array[i]);
if(value == null){
map.put(array[i], 1);
} else {
map.put(array[i], value + 1);
}
}
int maxValue = -1;
int maxKey = -1;
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
int nextValue = entry.getValue();
if(nextValue > maxValue){
maxValue = nextValue;
maxKey = entry.getKey();
}
}
return maxKey;
}
}
分享到:
相关推荐
《算法导论》是一本深度探讨计算机算法的权威著作,对于理解、设计和分析算法具有极其重要的指导价值。这本书深入浅出地介绍了各种基础和高级算法,是许多计算机科学专业学生以及软件工程师的重要参考书。中文版的...
这东西是以前觉得QQ农场比较有意思的时候写的,后来还让我同学帮忙分析分析数据, 结果后来太忙了,就一直荒废着,一直荒废到现在连QQ农场都快遗忘了 , 现在将我的分析与源代码 (VC++ 6.0) 发出来,有兴趣可以拿去...
仿制这种算法,意味着我们要创建一个类似的计算模型,它可能涉及到概率计算、动态定价和用户行为分析。 标签中的“GPS时钟程序”再次强调了时间同步的重要性,而“仿拼多多砍价算法”则提示我们将讨论一种与社交...
【电商数据可视化系统】是一个专为电商商户设计的分析工具,它通过数据可视化技术帮助商家理解和解析商品销售、用户行为等关键数据。该系统由【浙江大学软件学院】开发,项目名为“马云喊我来帮忙”,在天池平台的...
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构,从而不断改善...
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。 **应用场景:** - 当一组算法中的每一个都需要被单独封装时; - 当一个对象的行为可以通过...
- 它可能会设定一个最低价和最高价范围,确保砍价活动在可控范围内进行,同时保持吸引力。 - 算法还会考虑防止恶意刷价,确保活动公平性。 3. **源码解析**: - 源码中可能包含数据结构的设计,如用户信息、商品...
在这个问题中,小渊和小轩位于一个m行n列的矩阵的对角线上,希望通过其他同学的帮助传递纸条,而且希望找好心程度最高的同学帮忙。每个同学只能帮忙一次,即要么帮助纸条从小渊到小轩,要么帮助纸条从小轩回小渊。...
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。例如,在“三国”场景中,诸葛亮给赵云提供了三个锦囊妙计,这些妙计可以根据实际情况来选择...
我的联系方式是 ,如果对您有帮助还请帮忙点一个star。记录图形学开发内容,学习过程中的总结仓库: : 下载单一项目代码 GitZip for github插件的Chrome安装GitZip for github ,双击单个目录即下载。(每个项目一个...
此外每一个演算法中附带程式教学,大家可以透过手把手实作,不仅能够了解演算法概念,同时也能了解程式实作技巧。此系列将以影片教学方式呈现,未来也会陆续将此系列内容整理成电子书贡献给大家,希望这30天的教学中...
一类资源描述:Java ASP系统毕业设计资源 1. 概述:该资源集中于Java与ASP结合的Web系统毕业设计。对于学生而言,它提供了从初步的构想到实际开发所需的全方位辅助材料,包括论文、设计文档和源代码等。 2. 包含内容...
7. **部署**:项目的开发者提到可以在CSDN上帮忙部署,这意味着他们将协助把整个系统部署到一个在线平台,使其能够在互联网上运行,为用户提供实时访问和查询天气预测的服务。 通过这些关键技术,我们可以看到这个...
最近在做图象多重分形的分析,在MATHWORKS上找到一个国外程序,可以做.但是分 析的结果有点问题,a-f图的fmax大于2.另外,在运行的时候,会提示错误Size vector should be a row vector with integer elements, ...