博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode--Majority Element II
阅读量:4137 次
发布时间:2019-05-25

本文共 1528 字,大约阅读时间需要 5 分钟。

题目:总共n个元素,求超过n/k个的元素(占一定概率的元素),k=2,3,...

当k==2 时, moore voting algorithm:

用ret=nums[i],count计数,遍历nums,当nums[i]==ret时,count加1,当nums[i]!=ret时,count减1,count==0时,ret重新赋值nums[i];假设超过n/2的数一定存在,则返回 ret;

当k>2时,易得所求元素最多个数为n/k - 1,Linear-time Iceberg Query Algorithm:

第一步,查找候选元素:

若A[i]已在候选表中,即存在c使得,那么f(c) += 1。
若A[i]不在候选表中,且候选表仍有空位,即,那么将A[i]插入到表中,且f(A[i]) = 1。
若A[i]不在候选表中,且候选表已满。那么丢弃A[i],且对于候选表中每一元素,做f(c) -= 1。该操作完毕之后,所有f(c)归零的元素从候选表中移除。

第二步,遍历nums,判断候选表中的元素是否满足条件

第一题:

int majorityElement(int num[], int n) {    int ele, count = 0, i;	for (i = 0; i < n; i++)	{		if (count == 0){			ele = num[i];			count = 1;		}		else{			if (ele == num[i]){				count++;			}			else{				count--;			}		}	}	return ele;}
第二题:

int* majorityElement(int* nums, int numsSize, int* returnSize) {    int *ret = (int*)malloc(2 * sizeof(int));	int count[2];		int i;	count[0] = 0; count[1] = 0;	for (i = 0; i < numsSize; i++)	{				if (count[0] != 0 && nums[i] == ret[0]){			count[0]++;		}		else if (count[1] != 0 && nums[i] == ret[1]){			count[1]++;		}		else if (count[0] == 0){			ret[0] = nums[i];			count[0]++;		}		else if (count[1] == 0){			ret[1] = nums[i];			count[1]++;		}		else{			count[0]--;			count[1]--;		}	}	count[0] = 0, count[1] = 0;	for (i = 0; i < numsSize; i++)	{		if (nums[i] == ret[0])			count[0]++;		else if (nums[i] == ret[1])			count[1]++;	}	*returnSize = 0;	if (count[0] >numsSize/3){		(*returnSize) ++;	}	if (count[1] > numsSize / 3){		ret[*returnSize] = ret[1];		(*returnSize)++;	}	return ret;}
备注:①判断条件可以简化,更美观,不过对效率应该影响不大

  ②这个算法只会应用,原理证明忽略。。

转载地址:http://shovi.baihongyu.com/

你可能感兴趣的文章
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>