算法(二)找出数组中元素数目超出一半的元素
来源:互联网 发布:网络固定电话 编辑:程序博客网 时间:2024/06/08 05:17
题目如下:
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.
解题方法:
1. 最简单的方法,遍历整个数组,两层for循环,可以用set容器来排除前面已经出现过的元素,当重复数组元素很多时可以起到很好的效果,代码如下:
class Solution {public: int majorityElement(vector<int> & nums) { int n = nums.size(); set<int> temp; for (int i = 0; i < n; ++i) { if (temp.find(nums[i]) == temp.end()) { temp.insert(nums[i]); int count = 1; for (int j = i + 1; j < n; ++j) { if (nums[j] == nums[i]) count++; } if (count > n / 2) { return nums[i]; } } } return 0; }};
2. 只需要一层for循环,先用两个变量,一个majorElement记录当前认为的最多元素,初始化为第一个元素,一个number初始化为1,从第二个数开始遍历,遍历的元素与majorElement相同时加1,否则减去1。若numer小于0,表示当前majorElement已经小于已经遍历的元素一半,而在已经遍历元素当中,任一元素都小于已经遍历元素的一半。因此,真正的majorElement应当在未遍历的元素中占据超过一半的元素。所以,将majorElement重新设置为此时的元素值,number初始化为1,继续遍历。代码如下:
class Solution {public: int majorityElement(vector<int> & nums) { int majorNumber = nums[0]; int j = 1; for (int i = 1; i < nums.size(); ++i) { if (nums[i] == majorNumber) j++; else j--; if (j == -1) { majorNumber = nums[i]; j = 1; } } return majorNumber; }};
3. 数组元素数组超过一半的元素应当在排好序的数组的中间位置,所以可以用排序算法来解决这个问题。此外,此题可以不对数组进行完全排序,用冒泡排序可以排出前middle个最大元素即可。用快速排序只需让index == middle即可找到所要元素。类似快拍的方法代码如下:
class Solution {public: int majorityElement(vector<int> & nums) { int high = nums.size() - 1; int low = 0; int middle = high / 2; int index = partition(nums, 0, high); while (index != middle) { if (index < middle) low = index + 1; else high = index - 1; index = partition(nums, low, high); } return nums[index]; } int partition(vector<int> & nums, int low, int high) { if (low >= high) return low; int last_small = low; for (int i = low + 1; i <= high; ++i) { if (nums[i] < nums[low]) { last_small++; swap(nums, i, last_small); } } swap(nums, last_small, low); return last_small; } void swap(vector<int> & nums, int a, int b) { int temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; return; }};
注意:当有大量重复数据时,最后一种方法可能会出现运行超时的问题。
阅读全文
1 0
- 算法(二)找出数组中元素数目超出一半的元素
- 快速找出数组中元素数目超出一半的元素
- 找出一个数组中出现次数超过一半的元素
- 找出数组中最多的元素,已确定最多元素个数超过总数的一半
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 找出数组中出现次数超过数组长度一半的元素
- 找出数组中出现次数超过数组长度一半的元素—-腾讯
- 找出出现次数超过数组一半元素的数
- 找出数组中出现次数超过一半或者超过1/3的元素
- 求数组中超过一半的元素
- 数组中数字超过一半的元素
- [LeetCode-169] Majority Element(找出数组中超过一半元素)
- 数组中至多有一个出现次数大于数组长度一半元素,找出这个元素
- 找出数列中个数大于总数一半的元素
- 算法(三)找出数组中第K大元素
- 快速查找list中的大多数元素(数目超过一半的元素)
- 找出数组中唯一的重复元素
- 找出数组中唯一的重复元素
- 有边界线程池
- javascript获取父元素下所有节点/第一个节点
- Linux内核模块间函数调用正确方法
- 简单高精度加法
- centOS7服务器连接无线网络并搞定ssh命令整理
- 算法(二)找出数组中元素数目超出一半的元素
- springCloud基础配置
- vim配置文件
- javascript Date format(js日期格式化)
- Android 6.0权限处理
- java.util.concurrent.ConcurrentHashMap并发哈希表源码解析
- 顺时针旋转矩阵
- Qt中通过设置位图掩码生成异形控件【附源码】
- Java编程规范——重点摘要