在数组中寻找主要元素

来自:《数据结构与算法分析——C语言描述》练习2.19

问题描述:

大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(从而这样的元素最多有一个)。例如,数组

3,3,4,2,4,4,2,4,4 有一个主要元素4,而数组

3,3,4,2,4,4,2,4 没有主要元素。

题目给了一种递归的算法,不过不太理解。看了几位前辈的代码之后换了思路。下面是我的理解:

第一步,寻找候选元素。遍历数组元素,获得第一个元素将其写入ele,标记为1;接下来访问下一元素,如果它与ele相等,标记+1,否则-1。当ele减小到0时,继续读入下一元素到ele,并将标记重设为1。继续下去,直到最后一个元素。此时,ele获得出现次数最多的元素。

第二步,确定该元素是否主要元素。这个不难,用计数器统计该元素在数组中的出现次数count。如果count超过半个数组大小,该候选元素就是主要元素,返回即可;否则返回NOTFOUND。

时间复杂度显然是O(N)。

 1 int findCandidate(const int A[], int N)
 2 {
 3     int i, mark, ele;
 4
 5     mark = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         if (mark == 0)
 9         {
10             mark = 1;
11             ele = A[i];
12         }
13         else if (A[i] == ele)
14             mark++;
15         else
16             mark--;
17     }
18     return ele;
19
20 }
21
22 int findMajority(const int A[], int N)
23 {
24     int ele, i, count;
25
26     count = 0;
27     ele = findCandidate(A, N);
28     for (i = 0; i < N; i++)
29     if (A[i] == ele)
30         count++;
31     if (count > N / 2)
32         return ele;
33     return NOTFOUND;    //NOTFOUND is -1
34 }
时间: 2024-12-15 07:27:09

在数组中寻找主要元素的相关文章

Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respectively, design an algorithm to find the kth largest key. The order  of growth of the worst case running time of your algorithm should be logn, where n

leetcode——Search for a Range 排序数组中寻找目标下标范围(AC)

Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm's runtime complexity must be in the order of O(log n). If the target is not found in the array, return [-1, -1]. For example, Given [5, 7,

在数组中寻找对应和

Input:长度为n的数组作为查找对象,一个数字作为要查找的标准 Output:  挑选出数组中满足和为该数字的子数组 思路: 试想,若有一数组为[1, 2, 3, 4, 5, 6, 7, 8, 9]找到和为6的子数组.结果应该为[1,2,3], [1,5], [2,4], [6]. 当挑选出一个数字 i 后,继续查找的和是6 - i,数组去掉一个 i 元素. 同时,保持要查找的和不变,查找的子数组中不带有 i 元素的子数组 def find_numbers(desired_sum, list_

Java 数组中寻找最大子数组

程序设计思想: 依次将数组划分开,先判断一个元素的单个数组大小,接下来两个,依次上升,最后将所得结果进行比较赋值,输出最大结果. 1 package ketangTest; 2 //张生辉,康治家 2017.3.20 3 public class Test { 4 public static void main(String args[]){ 5 int b[]={-7,9,-2,84}; 6 int a[]={-7,9,-2,84,-7,9,-2,84}; 7 int max,max2,max

给定一个整数sum, 从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum

class FindClosestPairExample { public static void findAndPrintClosest(int[] arrayOne, int expectedSum) { int lenOne = arrayOne.length; //数组长度,默认全部填满. int diff = Integer.MAX_VALUE; //定义两数与期望值的差值:默认取最大整数 int resultOne = 0; //第一个元素 int resultTwo = 0; //

剑指Offer39 数组中寻找和为sum的两个数字

1 /************************************************************************* 2 > File Name: 39_TwoNumbersWithSum.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 11时14分49秒 6 *******************************

【.Net】从字符串数组中寻找数字的元素

那是写一个类别来处理数字元素并收集起来. 开发程序,解决方法不是唯一的.相同的功能实现,方法不止一个. 参考下面代码: 1 class Ak 2 { 3 private string[] _stringArray; 4 5 public Ak(string[] stringArray) 6 { 7 this._stringArray = stringArray; 8 } 9 10 public IEnumerable<Digit> Result() 11 { 12 // var result

js 数组中寻找两个值相加等于目标值, 三个值相加等于目标值

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> &

leetcode-1 Two Sum 找到数组中两数字和为指定和

 问题描述:在一个数组(无序)中快速找出两个数字,使得两个数字之和等于一个给定的值.假设数组中肯定存在至少一组满足要求. <剑指Offer>P214(有序数组) <编程之美>P176 Que:Given an array of integers, find twonumbers such that they add up to a specific target number. The function twoSum should return indices ofthe tw