【leetcode】Array—— Majority Element(169)
2016-03-07 21:31
471 查看
题目:
Given an array of size n, find the majority element. The majority element is the element that appears more than
You may assume that the array is non-empty and the majority element always exist in the array.
思路1:sort 很简单,把nums排序后,直接取下彪为num.length/2的值
代码:
思路2:HashMap 维护一下HashMap<Integer,Integer>,存每个元素出现的次数,找到次数大于nums.length/2的key即可,该方法runtime 较长,不推荐
代码:
思路3:Moore voting 还是第一次接触这个算法,leetcode上面看到的。看看别人的对该算法的理解:/article/1523621.html
代码:
思路4:Bit Manipulation 十分巧妙的算法!!用int bit[32] 记录nums中的每个元素(int类型),每位(int是32位)的1出现的次数。
例如,bit[32]初始化为[0,0,…,0,0], nums=[1,1,1,2,2], 则bit[32]=[0,0,…,0,0,2,3]
然后遍历bit中统计哪些位次数大于n/2,设为1,最后32位的bit就是结果的二进制
代码:
思路5:Divide and Conquer
还是看看leetcode上面的解释吧,表示没看懂……
This idea is very algorithmic. However, the implementation of it requires some careful thought about the base cases of the recursion. The base case is that when the array has only one element, then it is the majority one.
代码:
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:sort 很简单,把nums排序后,直接取下彪为num.length/2的值
代码:
public int majorityElement1(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
思路2:HashMap 维护一下HashMap<Integer,Integer>,存每个元素出现的次数,找到次数大于nums.length/2的key即可,该方法runtime 较长,不推荐
代码:
public int majorityElement(int[] nums) { int len = nums.length; Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ Integer count = map.get(nums[i]); map.put(nums[i], (count==null?1:++count)); if(map.get(nums[i])>len/2) return nums[i]; } return -1; }
思路3:Moore voting 还是第一次接触这个算法,leetcode上面看到的。看看别人的对该算法的理解:/article/1523621.html
代码:
public int majorityElement3(int[] nums) { int count=0, ret = 0; for (int num: nums) { if (count==0) ret = num; if (num!=ret) count--; else count++; } return ret; }
思路4:Bit Manipulation 十分巧妙的算法!!用int bit[32] 记录nums中的每个元素(int类型),每位(int是32位)的1出现的次数。
例如,bit[32]初始化为[0,0,…,0,0], nums=[1,1,1,2,2], 则bit[32]=[0,0,…,0,0,2,3]
然后遍历bit中统计哪些位次数大于n/2,设为1,最后32位的bit就是结果的二进制
代码:
public int majorityElement(int[] nums) { int[] bit = new int[32]; for (int num: nums) for (int i=0; i<32; i++) if ((num>>(31-i) & 1) == 1) bit[i]++; int ret=0; for (int i=0; i<32; i++) { bit[i]=bit[i]>nums.length/2?1:0; ret += bit[i]*(1<<(31-i)); } return ret; }
思路5:Divide and Conquer
还是看看leetcode上面的解释吧,表示没看懂……
This idea is very algorithmic. However, the implementation of it requires some careful thought about the base cases of the recursion. The base case is that when the array has only one element, then it is the majority one.
代码:
class Solution { public: int majorityElement(vector<int>& nums) { return majority(nums, 0, nums.size() - 1); } private: int majority(vector<int>& nums, int left, int right) { if (left == right) return nums[left]; int mid = left + ((right - left) >> 1); int lm = majority(nums, left, mid); int rm = majority(nums, mid + 1, right); if (lm == rm) return lm; return count(nums.begin() + left, nums.begin() + right + 1, lm) > count(nums.begin() + left, nums.begin() + right + 1, rm) ? lm : rm; } };
相关文章推荐
- 改变文件所有者
- win10 UWP MessageDialog 和 ContentDialog
- [BZOJ 4409] [Usaco2016 Feb]Circular barn
- 区间比较equal
- 生成真静态页面
- 作业2
- 软件测试第一次作业
- 3月7日 分支语句
- java中的sleep()和wait()的区别
- 近邻搜索算法
- PHP笔记(一)安装配置过程:memcache
- 计算日期
- 动态规划 最少拦截系统
- CentOS6.7安装 vmare tools
- CodeIgniter重定向页面问题
- POJ 1971 Parallelogram Counting【平面几何】
- 静态static
- Java命名规范
- 【nova】liberty版本openstack在线调整云主机大小
- Git创建本地版本仓库