leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)
题目描述:
Given an integer array with even length, where different numbers in this array represent different kinds of candies. Each number means one candy of the corresponding kind. You need to distribute these candies equally in number to brother and sister. Return the maximum number of kinds of candies the sister could gain.
Example 1:
Input: candies = [1,1,2,2,3,3]
Output: 3
Explanation:
There are three different kinds of candies (1, 2 and 3), and two candies for each kind.
Optimal distribution: The sister has candies [1,2,3] and the brother has candies [1,2,3], too.
The sister has three different kinds of candies.
Example 2:
Input: candies = [1,1,2,3]
Output: 2
Explanation: For example, the sister has candies [2,3] and the brother has candies [1,1].
The sister has two different kinds of candies, the brother has only one kind of candies.
Note:
- The length of the given array is in range [2, 10,000], and will be even.
- The number in given array is in range [-100,000, 100,000].
要完成的函数:
int distributeCandies(vector<int>& candies)
说明:
1、这道题给了一个vector,里面每个数字代表一种糖果,比如[1,1,2,2,3,3],代表1糖果有2个,2糖果有2个,3糖果有2个。这个vector的长度必定为偶数,要把糖果均分给哥哥和妹妹,妹妹能分到的一半糖果最多能有多少种。
2、假如我们知道有n种糖果,妹妹能分到m个糖果,如果n<=m,那说明里面重复的很多,比如[1,1,1,1,2,2],妹妹能分到3个糖果,而糖果只有2种,那么妹妹最多能得到的种类数也不会超过n,只能多拿一些重复的了。
如果n>m,也就是说糖果种类比妹妹能拿到的糖果个数还多,那说明有很多种类各异的,比如[1,2,3,4,5,5],妹妹能分到3个糖果,而糖果有5种,那么妹妹能得到的最多种类数也只有3种。
思路清晰,我们可以构造如下代码:
int distributeCandies(vector<int>& candies)
{
int total=candies.size()/;
set<int>s1(candies.begin(),candies.end());
int kind=s1.size();
if(kind<=total)
return kind;
else
return total;
}
这是最简单的实现方法,利用set得到了种类数。
上述代码实测333 ms,beats 30.13% of cpp submissions。
3、改进:
我们使用set,其实是把vector中的元素一个个加进去,每碰到一个元素就判断这个元素有没有出现过,如果有就不加入,如果没有就加入。判断的这个过程其实又是一个循环。
所以set的办法其实是双重循环,O(n^2)。
但我们其实并不需要处理数,我们所需要的,只是知道vector中有多少种数。
所以我们其实可以对vector做一个快速排序,然后做单重循环,如果前一个数和后一个数不一样,那么种类数+1。
这样子的排序+单重循环的方法,时间复杂度低于O(n^2)。
代码如下:
int distributeCandies(vector<int>& candies)
{
int total=candies.size()/;
sort(candies.begin(),candies.end());
int kind=;
for(int i=;i<candies.size()-;i++)
{
if(candies[i+]!=candies[i])
kind++;
}
if(kind<=total)
return kind;
else
return total;
}
上述代码实测258ms,beats 82.50% of cpp submissions。
4、另一种方法:
因为题目限定了数的范围在[-100,000,100,000],所以其实我们可以开辟一个长度为200001的vector。
接着迭代给定vector,更新长度为200001的vector的值。
最后再迭代这个长vector,看一下有多少种。
但是由于长vector长度太长了,所以这种方法花费时间很多,不是很推荐。这里只是做一个扩展介绍。
这道题的启示还是:当碰到需要判断vector中有多少种数字时,可以先做一个快速排序,接着单重循环。
leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)的更多相关文章
- LeetCode 575. Distribute Candies (发糖果)
Given an integer array with even length, where different numbers in this array represent different k ...
- LeetCode 575 Distribute Candies 解题报告
题目要求 Given an integer array with even length, where different numbers in this array represent differ ...
- LeetCode: 575 Distribute Candies(easy)
题目: Given an integer array with even length, where different numbers in this array represent differe ...
- javascript中获取字符串或数组中元素的索引
有些时候,我们需要知道一个字符串中字符的位置,或者一个数组中元素的位置,这是就需要对该变量进行迭代操作. 对于数组,有两个方法indexOf和findIndex() , 需要注意的是,findInde ...
- 【leetcode】Merge Sorted Array(合并两个有序数组到其中一个数组中)
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assum ...
- [LeetCode] 624. Maximum Distance in Arrays 数组中的最大距离
Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t ...
- C#实现如何判断一个数组中是否有重复的元素
如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hashtable的Contains方法进行查找 /// ...
- C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
C#实现如何判断一个数组中是否有重复的元素 如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...
- JAVA经典题--计算一个字符串中每个字符出现的次数
需求: 计算一个字符串中每个字符出现的次数 思路: 通过toCharArray()拿到一个字符数组--> 遍历数组,将数组元素作为key,数值1作为value存入map容器--> 如果k ...
随机推荐
- Opencv threshold
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果.在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓 ...
- Java中String类型详解
这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...
- Qt自定义插件编程小结
qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...
- SQL基础问题(一)
1.sql是什么? 结构化查询语言(Structured Query Language). 2.结构化查询语言的分类? 数据定义语言(DDL)Data Definition Language 操作 ...
- 【原创】cython and python for kenlm
未经允许不可转载 Kenlm相关知识 Kenlm下载地址 kenlm中文版本训练语言模型 如何使用kenlm训练出来的模型C++版本 关于Kenlm模块的使用及C++源码说明 加载Kenlm模块命令 ...
- Spring.net 后处理器 可用来切换实例
.xml配置 <!--我们在Object.xml文件上将HexuObjectPostProcessor注册到上下文对象中去--> <object id="hexu" ...
- 无归档情况下使用BBED处理ORA-01113错误
在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...
- 白盒测试实践--Day5
累计完成任务情况: 阶段内容 参与人 完成个人情况说明并提交作业 全体 汇总作业,查漏补缺,完成代码测试总结 小靳.小龙 完成测试小结 小黄.小尹 完成静态代码检查结果报告 小靳 完成JUnit脚本编 ...
- [GO]方法的继承
package main import "fmt" type Person struct { name string sex byte age int } func (tmp Pe ...
- CodeForces 347B Fixed Points (水题)
题意:给定 n 数,让你交换最多1次,求满足 ai = i的元素个数. 析:很简单么,只要暴力一遍就OK了,先把符合的扫出来,然后再想,最多只能交换一次,也就是说最多也就是加两个,然后一个的判,注意数 ...