169. Majority Element

求超过数组个数一半的数

可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n)

class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int> count;
int n=nums.size();
for(int i=;i<n;i++){
if(++count[nums[i]]>n/) return nums[i];
}
return ;
}
};

使用投票法,时间复杂度为O(n),空间复杂度为O(1)。

投票法就是记录出现的频次

leetcode是默认了有超过的,所以可以直接这样返回。像剑指offer上,还要用这个数去累加计算看是否真的超过了n/2。

class Solution {
public:
int majorityElement(vector<int>& nums) {
int freq = ;
int res;
for(int i = ;i < nums.size();i++){
if(freq == ){
res = nums[i];
freq++;
}
else if(nums[i] == res)
freq++;
else
freq--;
}
return res;
}
};

229. Majority Element II

求个数超过n/3的数

首先明确最多只有可能有2个数超过,如果有3个数都超过了,那数组的个数肯定大于n了。

还是使用投票法。

错误写法:这个写法先去考虑了freq1、2,实际上应该首先考虑是否和当前数字相当,如果不相等再去考虑freq的问题

Input:
[1,2,2,3,2,1,1,3]
Output:
[1]
Expected:
[2,1]

class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> result;
int num1,num2,freq1 = ,freq2 = ;
for(int i = ;i < nums.size();i++){
if(freq1 == ){
num1 = nums[i];
freq1++;
}
else if(nums[i] == num1)
freq1++;
else if(freq2 == ){
num2 = nums[i];
freq2++;
}
else if(nums[i] == num2)
freq2++;
else{
freq1--;
freq2--;
}
}
freq1 = ,freq2 = ;
for(int i = ;i < nums.size();i++){
if(nums[i] == num1)
freq1++;
if(nums[i] == num2)
freq2++;
}
if(freq1 > nums.size()/)
result.push_back(num1);
if(freq2 > nums.size()/ && num1 != num2)
result.push_back(num2);
return result;
}
};

正确写法:

class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> result;
int num1 = ,num2 = ,freq1 = ,freq2 = ;
for(int i = ;i < nums.size();i++){
if(nums[i] == num1)
freq1++;
else if(nums[i] == num2)
freq2++;
else if(freq1 == ){
num1 = nums[i];
freq1++;
}
else if(freq2 == ){
num2 = nums[i];
freq2++;
}
else{
freq1--;
freq2--;
}
}
freq1 = ,freq2 = ;
for(int i = ;i < nums.size();i++){
if(nums[i] == num1)
freq1++;
else if(nums[i] == num2)
freq2++;
}
if(freq1 > nums.size()/)
result.push_back(num1);
if(freq2 > nums.size()/)
result.push_back(num2);
return result;
}
};

leetcode 169. Majority Element 、229. Majority Element II的更多相关文章

  1. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  2. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

  3. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  4. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  5. leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II

    131. Palindrome Partitioning substr使用的是坐标值,不使用.begin()..end()这种迭代器 使用dfs,类似于subsets的题,每次判断要不要加入这个数 s ...

  6. leetcode 280.Wiggle Sort 、324. Wiggle Sort II

    Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...

  7. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  8. leetcode 62. Unique Paths 、63. Unique Paths II

    62. Unique Paths class Solution { public: int uniquePaths(int m, int n) { || n <= ) ; vector<v ...

  9. leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)

    House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...

随机推荐

  1. 精读《React PowerPlug 源码》

    1. 引言 React PowerPlug 是利用 render props 进行更好状态管理的工具库. React 项目中,一般一个文件就是一个类,状态最细粒度就是文件的粒度.然而文件粒度并非状态管 ...

  2. import 和 export

    1.export 命令 export 命令用于规定模块的对外接口. 一个模块就是一个独立的文件.该文件内部所有的变量,外部无法获取.要想外部能够读取模块内部的某个变量,就必须使用 export 关键字 ...

  3. 【WCF学习大全】

    我的WCF之旅(1):创建一个简单的WCF程序 我的WCF之旅(2):Endpoint Overview 我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communica ...

  4. opensuse使用zypper安装软件

    安装软件(opensuse) opensuse 通过zypper可以方便的进行软件管理,类似centos的yum 软件. 命令参考 软件包操作 搜索软件 zypper search package 安 ...

  5. [十七]基础类型BigDecimal简介

      BigDecimal是不可变的.任意精度的.有符号的.十进制数.   组成部分 BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 BigDecimal ...

  6. javascript基础修炼(1)——一道十面埋伏的原型链面试题

    在基础面前,一切技巧都是浮云. 题目是这样的 要求写出控制台的输出. function Parent() { this.a = 1; this.b = [1, 2, this.a]; this.c = ...

  7. 服务器配置用户信息、ssh免密码登录和防火墙等安全配置

    一.登录服务器      1.回到根目录 cd ~      2.ssh + 用户名@服务器公网地址 ssh root@47.94.208.76      3.输入密码:注意输入法大小写 二.查看服务 ...

  8. C# 如何更改Word语言设置

    一般在创建或者打开一个Word文档时,如果没有进行过特殊设置的话,系统默认的输入语言的是英语输入,但是为适应不同的办公环境,我们其实是需要对文字嵌入的语言进行切换的,因此,本文将介绍如何使用免费版组件 ...

  9. Lucene.Net3.0.3+盘古分词器学习使用

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  10. JS、CSS中的相对路径

    css中url(../images/1.jpg)路径是相对于index.css的 js中url(images/1.jpg)路径是相对于index.html的,并不是相对于index.js