已知一个整数序列 A =(a 0 ,a 1 ,..., a n-1 ),找出 A 的主元素
2020-04-05 18:18
357 查看
用时间复杂度O(n)的算法。
思路:序列中删去两个不相等的数,主元素不变。
步骤一:选择第一个元素为候选主元素,使用一个计数器,初始值为1,碰见一个相同值的元素,计数器加1否则减一。若计数器的值已经等于0,则更换为下个元素为候选主元素。最后计数器值的意义是从左到右不停删去两个不相等的数,剩下相同数即候补主元素的个数。
步骤二:判断是否是真正的主元素,统计候补主元素个数
int majority(int A[],int n) { int i,c,count=1; c=A[0]; for(i=1;i<n;++i){ if(A[i]==c) count++; else{ if(count>0) count--; else{ c=A[i]; count=1; } } } if(count>0){ for(i=count=0;i<n;++i){ if(A[i]==c); count++; } } if(count>n/2) return c; else return -1; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- (此题重点!!!)已知一个整数序列 A =(a 0 ,a 1 ,..., a n-1 ),找出 A 的主元素
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。要求时间复杂度为O(n)。
- 取值为[1,n-1]含n个元素的整数数组,至少存在一个重复数,即可能存在多个重复数,O(n)时间内找出其中任意一个重复数,不使用额外存储空间。
- 给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次,编写代码找出数组中的某个元素
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 谷歌:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- 取值为[1,n-1]含n个元素的整数数组至少存在一个重复数,找出一个重复元素
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 取值为[1,n-1] 含n 个元素的整数数组至少存在一个重复数,O(n) 时间内找出其中任意一个重复数
- 给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数,请在这个特殊数组中找出给定的整数
- 面试题:n个整数的序列,其中一个整数重复次数超过一半,在O(n)时间内找出该整数
- 给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。