题目地址:

https://oj.leetcode.com/problems/majority-element/

题目内容:

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

方法:

要求有两个:

0、时间复杂度是O(N)

1、空间复杂度是O(1)  // 这个是当然的,否则来一个hashmap,谁不会 = _ =!

要点是维护这么一个性质:

首先,不妨假设目标元素出现了a次,而总共有b个元素,那么:

1>= b/a >= 1/2

我们可以设定两个指针,一个指向头部,一个指向尾部。要点在于维护这么一个性质:首尾指针之间的数组,目标元素数量占全部数量的1/2下取整之上。如果两个指针指向的元素不相等,说明此时至少有一个指针指向的元素不是所要求的元素,因此,我们可以抛弃这两个元素,这个时候目标元素在源数组中的比率不会降低。

证明就比较简单了。假设最坏的情况,有一个是目标元素,另一个不是,则有:

b/a < (b-1)/(a-2),当2b >= a时成立。而2b >= a是题目给出的条件。

那么如果两个元素相等呢?我们还能抛弃这两个元素吗?回答是不能。因为(b-1)/(a-1) < b/a,不能维持目标元素在原数组中比率不降低的性质。

那该怎么办?答案是维护一个指向当前元素【下一个不相等】的指针,如果相等,那么和下一个和自己不相等的元素交换位置即可。这个指向下一个不相等的指针只会往前走,因此,最多走n次。而我们总共维护4个指针,最多O(4n),还是O(n)。

下面是具体代码:

class Solution {
public:
int majorityElement(vector<int> &num) {
int start = ;
int fin = num.size() - ;
int startnxt = findNextStart(start,num,start); //找到下一个和start不等的指针。
int finnxt = findNextFin(fin,num,fin);
while (start < fin)
{
if (num[start] == num[fin])
{
if (startnxt >= finnxt) // 若当前首尾指针指向的数据相等,那么下轮操作后之间的数据就全部相等了,故可以直接返回结果。
return num[start];
swap(&num[start],&num[startnxt]);
}
start ++;
fin --;
startnxt = findNextStart(start,num,startnxt);
finnxt = findNextFin(fin,num,finnxt);
}
return num[start];
} int findNextStart(int start,vector<int> &num,int preptr)
{
int nowNumber = num[start];
int nxtPtr = preptr == start ? start + : preptr; // 若prestart正好为start,那么前进一格。否则在既有基础上出发。
while (nxtPtr < num.size() && num[start] == num[nxtPtr])
nxtPtr ++;
return nxtPtr;
} int findNextFin(int fin,vector<int> &num,int preptr)
{
int nowNumber = num[fin];
int nxtPtr = preptr == fin ? fin - : preptr;
while (nxtPtr >= && num[fin] == num[nxtPtr])
nxtPtr --;
return nxtPtr;
} void swap(int *a,int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
};

【原创】leetCodeOj --- Majority Element 解题报告(脍炙人口的找n个元素数组中最少重复n/2次的元素)的更多相关文章

  1. 【LeetCode】169. Majority Element 解题报告(Java & Python & C+)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 思路 hashmap统计次数 摩尔投票法 Moore ...

  2. LeetCode 169 Majority Element 解题报告

    题目要求 Given an array of size n, find the majority element. The majority element is the element that a ...

  3. 【LeetCode】162. Find Peak Element 解题报告(Python)

    [LeetCode]162. Find Peak Element 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/ ...

  4. LeetCode 169. Majority Element解题方法

    题目: Given an array of size n, find the majority element. The majority element is the element that ap ...

  5. Lintcode: Majority Number 解题报告

    Majority Number 原题链接:http://lintcode.com/en/problem/majority-number/# Given an array of integers, th ...

  6. 【LeetCode】27. Remove Element 解题报告(Python & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 记录起始位置 日期 题目地址:https:/ ...

  7. 【原创】leetCodeOj --- Find Peak Element 解题报告

    题目地址: https://oj.leetcode.com/problems/find-peak-element/ 题目内容: A peak element is an element that is ...

  8. 【原创】leetCodeOj --- Min Stack 解题报告

    题目地址: https://oj.leetcode.com/problems/min-stack/ 题目内容: Design a stack that supports push, pop, top, ...

  9. 【原创】leetCodeOj --- Dungeon Game 解题报告

    原题地址: https://oj.leetcode.com/problems/dungeon-game/ 题目内容: The demons had captured the princess (P) ...

随机推荐

  1. 数字雨Shopex 4.8.5 SQL Injection Exp

    # -*- coding:utf-8 -* #Author:MXi4oyu #Email:798033502@qq.com #Shopex 4.8.5 SQL Injection Exp #转载请说明 ...

  2. remove()和直接使用system的一个差别

    1.事出有因 今天在做一个从web页面中得到POST回应数据的时候.须要把暂时目录里面(包括子文件)内容清空.本来一直使用的是system("rmdir /s /q ..//tmp//dat ...

  3. 用jsp写注冊页面

    包含单选框.多选框.session的应用,页面自己主动跳转,中文乱码的处理,入门级 对于中文乱码的处理,注意几点:注冊页面数据提交方式为post不能忘了写,页面编码方式为gbk,处理提交信息的doRe ...

  4. 算法起步之Bellman-Ford算法

    原文:算法起步之Bellman-Ford算法 从这篇开始我们开始介绍单源最短路径算法,他是图算法之一,我们前面说的贪心,图的遍历,动态规划都是他的基础,单源最短路径其实说的就是图中节点到节点的最短路径 ...

  5. Zigbee开发(1)

    只是研究zigbee的技术,也许后续的博客不会有很及时的更新,有时间 写一点东西能让大家有所收获吧. 环境搭建 Windows 64位的操作系统 IAR7.6 for 8051 ZStack CC25 ...

  6. stripslashes和addslashes的区别

    我们在向mysql写入数据时,比如: mysql_query(”update table set `title`=’kuhanzhu’s blog’”); 那就会出错.同asp时一样,数据库都会对单引 ...

  7. Android自己定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...

  8. like-minded 都有什么意思_百度知道

    like-minded 都有什么意思_百度知道 like-minded 都有什么意思

  9. 【POJ3159】Candies 裸的pqspfa模版题

    不多说了.就是裸的模版题. 贴代码: <span style="font-family:KaiTi_GB2312;font-size:18px;">#include & ...

  10. Python数据结构-序列

    shopList=['apple','orange','pen'] print(shopList) print(]) print(]) print(:])) print(])) 运行结果: ['app ...