169. Majority Element

求超过数组个数一半的数

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

  1. class Solution {
  2. public:
  3. int majorityElement(vector<int>& nums) {
  4. unordered_map<int,int> count;
  5. int n=nums.size();
  6. for(int i=;i<n;i++){
  7. if(++count[nums[i]]>n/) return nums[i];
  8. }
  9. return ;
  10. }
  11. };

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

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

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

  1. class Solution {
  2. public:
  3. int majorityElement(vector<int>& nums) {
  4. int freq = ;
  5. int res;
  6. for(int i = ;i < nums.size();i++){
  7. if(freq == ){
  8. res = nums[i];
  9. freq++;
  10. }
  11. else if(nums[i] == res)
  12. freq++;
  13. else
  14. freq--;
  15. }
  16. return res;
  17. }
  18. };

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]

  1. class Solution {
  2. public:
  3. vector<int> majorityElement(vector<int>& nums) {
  4. vector<int> result;
  5. int num1,num2,freq1 = ,freq2 = ;
  6. for(int i = ;i < nums.size();i++){
  7. if(freq1 == ){
  8. num1 = nums[i];
  9. freq1++;
  10. }
  11. else if(nums[i] == num1)
  12. freq1++;
  13. else if(freq2 == ){
  14. num2 = nums[i];
  15. freq2++;
  16. }
  17. else if(nums[i] == num2)
  18. freq2++;
  19. else{
  20. freq1--;
  21. freq2--;
  22. }
  23. }
  24. freq1 = ,freq2 = ;
  25. for(int i = ;i < nums.size();i++){
  26. if(nums[i] == num1)
  27. freq1++;
  28. if(nums[i] == num2)
  29. freq2++;
  30. }
  31. if(freq1 > nums.size()/)
  32. result.push_back(num1);
  33. if(freq2 > nums.size()/ && num1 != num2)
  34. result.push_back(num2);
  35. return result;
  36. }
  37. };

正确写法:

  1. class Solution {
  2. public:
  3. vector<int> majorityElement(vector<int>& nums) {
  4. vector<int> result;
  5. int num1 = ,num2 = ,freq1 = ,freq2 = ;
  6. for(int i = ;i < nums.size();i++){
  7. if(nums[i] == num1)
  8. freq1++;
  9. else if(nums[i] == num2)
  10. freq2++;
  11. else if(freq1 == ){
  12. num1 = nums[i];
  13. freq1++;
  14. }
  15. else if(freq2 == ){
  16. num2 = nums[i];
  17. freq2++;
  18. }
  19. else{
  20. freq1--;
  21. freq2--;
  22. }
  23. }
  24. freq1 = ,freq2 = ;
  25. for(int i = ;i < nums.size();i++){
  26. if(nums[i] == num1)
  27. freq1++;
  28. else if(nums[i] == num2)
  29. freq2++;
  30. }
  31. if(freq1 > nums.size()/)
  32. result.push_back(num1);
  33. if(freq2 > nums.size()/)
  34. result.push_back(num2);
  35. return result;
  36. }
  37. };

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-easy-state 源码》

    1. 引言 react-easy-state 是个比较有趣的库,利用 Proxy 创建了一个非常易用的全局数据流管理方式. import React from "react"; i ...

  2. Java虚拟机详解----JVM内存结构

    http://www.cnblogs.com/smyhvae/p/4748392.htm 主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程: JVM启 ...

  3. ueditor上传图片尺寸过大导致显示难看的解决办法

    昨天遇到这个问题,我也是折腾成了狗, 到处查,最后收集到三个办法,记录一下. 代码贴这里,方便复制 img { max-width: 100%; /*图片自适应宽度*/ } body { overfl ...

  4. Java开发知识之Java中的泛型

    Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...

  5. Spring Boot(十三)RabbitMQ安装与集成

    一.前言 RabbitMQ是一个开源的消息代理软件(面向消息的中间件),它的核心作用就是创建消息队列,异步接收和发送消息,MQ的全程是:Message Queue中文的意思是消息队列. 1.1 使用场 ...

  6. 【Zabbix】CentOS6.9系统下部署Zabbix-agent

    目录 安装Zabbix-agent 1.安装YUM源 2.安装Zabbix agent端 3.配置zabbix_agentd.conf文件 4.启动zabbix agent服务 5.zabbix图形界 ...

  7. SDWebImage源码解析

    但凡经过几年移动开发经验的人去大公司面试,都会有公司问到,使用过哪些第三方,看过他们的源码嘛?而SDWebImage就是经常被面试官和应聘者的提到的.下面将讲述SDWebImage的源码解析以及实现原 ...

  8. DSAPI多功能组件编程应用-网络相关(上)

    [DSAPI.DLL下载地址]  DSAPI多功能组件编程应用-网络相关,网络相关编程有很多很多,这里讲解一下封装在DSAPI中的网络相关的功能,这些都是本人简化到极点的功能了,可以在软件开发过程中节 ...

  9. InnoSetup 客户端程序打包教程

    之前介绍过InstallShield打包工具,本文再介绍更加方便的打包工具Inno Setup Inno Setup相对来说,比InstallShield更容易使用,不需要在VS中创建项目,只要提供D ...

  10. 【小o地图Excel插件版】不止能做图表,还能抓58、大众点评网页数据...

    小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...