169. 多数元素

知识点:数组;排序;消消乐;分治

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例
输入:[3,2,3]
输出:3 输入:[2,2,1,1,1,2,2]
输出:2

解法一:排序

因为这道题中说了一定有一个数字是大于一半的,所以可以直接将数组进行排序,然后中间那个数一定是出现超过一半的。

class Solution {
public int majorityElement(int[] nums) {
if(nums.length == 1) return nums[0];
Arrays.sort(nums);
return nums[nums.length/2];
}
}

解法二:消消乐(投票法)

一定有一个数字超过一半,所以如果两个不同的数字两两抵消的话最后留下来的那个一定就是出现次数超过一半的。先选最开始的作为候选人,然后count=1, 如果后面遇到一样的,count++,遇到不一样的,count--,count一旦到0以后,那就需要换新的候选人了。

class Solution {
public int majorityElement(int[] nums) {
int res = nums[0], count = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] != res){
count--;
if(count == 0){
res = nums[i];
count = 1;
}
}else{
count++;
}
}
return res;
}
}

解法三:分治

如果有一个数字出现次数超过了一半,那将这个数组分成两半后,那这个数必定至少在其中一部分超过一半。

反证:如果这个数字在两半里都没超过一半,那在整个数组里必定也没超过一半。所以可以分别求两个子数组里超过一半的数字,然后选出两个里真正的出现最多的。

  • 如果这两个数字相同,那必定就是它了;
  • 如果这两个数字不同,统计两个数字分别在数组里出现的次数,大的就是了;
class Solution {
public int majorityElement(int[] nums) {
return majorityElement(nums, 0, nums.length-1); //区间是左闭右闭;
}
private int majorityElement(int[] nums, int left, int right){
if(left == right){
return nums[left]; //结束条件;
}
int mid = left+((right-left) >> 1);
int leftnum = majorityElement(nums, left, mid); //左右两侧的超过一半的数字;
int rightnum = majorityElement(nums, mid+1, right); if(leftnum == rightnum) return leftnum;
int leftcount = countNum(nums, leftnum, left, right); //比较两个数字谁次数多;
int rightcount = countNum(nums, rightnum, left, right);
return leftcount > rightcount ? leftnum : rightnum;
}
private int countNum(int[] nums, int num, int left, int right){
int count = 0;
for(int i = left; i <= right; i++){
if(nums[i] == num){
count++;
}
}
return count;
}
}

【LeetCode】169. 多数元素的更多相关文章

  1. Java实现 LeetCode 169 多数元素

    169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输 ...

  2. LeetCode | 169. 多数元素

    给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [3,2,3] ...

  3. Leetcode:169. 多数元素

    Leetcode:169. 多数元素 传送门 思路 一开始想到的一个很简单的做法就是hash法,直接利用打表记录次数再输出结果. 而利用BM算法可以令算法复杂度同样也在\(O(n)\)的情况下,将空间 ...

  4. LeetCode移除元素

    LeetCode 移除元素 题目描述 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不需要使用额外的数组空间,你必须仅使用 O(1) ...

  5. [LeetCode] 169. Majority Element 多数元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  6. leetcode——169 Majority Element(数组中出现次数过半的元素)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  7. leetcode 169 Majority Element 冰山查询

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  8. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  9. Leetcode#169. Majority Element(求众数)

    题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

随机推荐

  1. POJ 3026 Borg Maze 广搜(BFS)+最小生成树

    题意:从S出发,去抓每一个A,求总路径最短长度.在S点和A点人可以分身成2人,不过一次只能让一个人走. 思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板. 一次性A了.不过觉得在判断 ...

  2. 暑假自学java第五天

    关于测试类的问题: 单独创建一个包存放测试类,如com.test 首先要构建路径添加测试类的相关类库,方法是项目右键,buld path->config buld path->librar ...

  3. Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试

    本文是对Redis 单节点,针对不同的数据类型,做插入行测试. 数据总条数为:10058624 环境说明:             Redis 未做任何优化, 单节点    (服务器上, 内存64G) ...

  4. hadoop安装前的准备

    1.操作系统安装 2.hostname设定 3.hosts文件设定 4.ssh免密码登录 5.NTP时间同步设定 6.iptables永久关闭 7.selinux永久关闭

  5. 17 shell break与continue

    使用 while.until.for.select 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或者 continue 关键字. 在C语言.Python.Ja ...

  6. linux学习之路第二天(xshell和xftp的使用图解)

    以上xshell的连接过程 2.远程上传和下载文件xftp6 一定要换成22和sftp,否则连接不上 如果出现中文乱码的情况 先点击那个小齿轮 再点击选项 把编码编程UTF-8就ok了

  7. Redhat 6.9 升级SSH到OpenSSH_8.6p1完整文档

    这个文章是转载,原文连接在这个:https://www.cnblogs.com/xshrim/p/6472679.html 这个问题遇到过,下面可以解决 ----------------------- ...

  8. Nacos配置中心功能

    目录 Nacos的配置管理模型 命名空间(Namespace) 配置分组(Group) 配置集(Data ID) 配置项 一个最佳实践 命名空间管理 配置管理 参考 Nacos的配置管理模型 对于Na ...

  9. VRRP概述作用及配置

    文章目录 VRRP的概述 VRRP的作用 虚拟路由器 Master报文的发送 VRRP状态机 VRRP华为命令配置 VRRP的概述1.利用VRRP,一组路由器(同一个LAN中的接口),协同工作,但是只 ...

  10. python 查看导入模块的函数和方法

    将twain.pyd复制到Python27 \ Lib \ site-packages 首先 import XXX(包括pyd的文件名)print(dir(XXX))print(help(xxx)) ...