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. leetcode — merge-sorted-array

    import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/merge-sorted-array/ * * * G ...

  2. SmartSql For Asp.Net Core 最佳实践

    常规操作 安装 SmartSql Install-Package SmartSql 安装 SmartSql.DIExtension Install-Package SmartSql.DIExtensi ...

  3. 菜鸟系列docker——docker基本概念(1)

    docker基本概念 1.准备 这里先介绍容器技术,后续再介绍docker.docker是容器的一种,除docker以外,还存在coreos.不过在当前趋势下容器和docker基本上可以划为等号了. ...

  4. rpm和yum软件管理(week2_day5)--技术流ken

    rpm简介 这是一个数据库管理工具,可以通过读取数据库,判断软件是否已经安装,如果已经安装可以读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Package ...

  5. Phpstudy升级到Mysql8

    之前一直用的mysql5.5,最近发现Mysql8更新了很多新特性以及查询效率的提升,觉得很有必要更新下开发版本,好,废话不多说: 1.下载安装包,下载地址:mysql8.0  .如果你想要下载其它版 ...

  6. C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签

    概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入.删除书签的方法,本篇文章将对C# 操作Word书签的功能做进 ...

  7. Java的几道面试题目以及简短回答做个记录保存

      最近没有继续用CSDN写博客了,转到博客园,什么时候自己搭建一个博客就好了. 一 谈谈你对Spring的工作原理的理解 引用一篇博客的讲解,https://www.cnblogs.com/xdp- ...

  8. Archive & Backup 概念

    Archive & Backup 提起归档和备份两个词,给人感觉上是相同的概念,就是对指定文件的一个copy而已.archive和backup感觉是相似的,但是他们有着明显的不同de. arc ...

  9. mixins混入

    mixins混入:定义类,多重继承 使用方法见附件: mixins混入.zip    

  10. 诗人般的机器学习,ML工作原理大揭秘

    诗人般的机器学习,ML工作原理大揭秘 https://mp.weixin.qq.com/s/7N96aPAM_M6t0rV0yMLKbg 选自arXiv 作者:Cassie Kozyrkov 机器之心 ...