首页 > 编程语言 >力扣575(java&python)-分糖果(简单)

力扣575(java&python)-分糖果(简单)

时间:2022-10-29 10:58:54浏览次数:74  
标签:set java python candyType Alice 575 int 糖果 种类

题目:

Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。

医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。

给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的 最多 种类数。

 

示例 1:

输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。
示例 2:

输入:candyType = [1,1,2,3]
输出:2
解释:Alice 只能吃 4 / 2 = 2 枚糖,不管她选择吃的种类是 [1,2]、[1,3] 还是 [2,3],她只能吃到两种不同类的糖。
示例 3:

输入:candyType = [6,6,6,6]
输出:1
解释:Alice 只能吃 4 / 2 = 2 枚糖,尽管她能吃 2 枚,但只能吃到 1 种糖。
 

提示:

n == candyType.length
2 <= n <= 104
n 是一个偶数
-105 <= candyType[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/distribute-candies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

今天是完全不看题解,能直接写出来的简单题第3道。

一、模拟

我观察了一下示例,数组candyType的长度就为糖果的总数,于是先求出糖果的总数,再算出Alice能吃多少枚糖nums,因为有重复种类的糖果,就用set的去重特征把重复的糖果种类去掉,最终set集合中存在的是唯一的糖果种类

  • 如果nums >= set.size():说明能吃的数量大于糖果种类,但是种类只有额定数量,故最多也只能吃set.size();
  • 如果nums < set.size():说明能吃的糖果数量小于糖果种类数,但是只能吃nums种。

java代码:

 1 class Solution {
 2     public int distributeCandies(int[] candyType) {
 3         int n = candyType.length;
 4         int nums = n / 2;
 5         HashSet<Integer> set = new HashSet<>();
 6         for(int i = 0; i < n; i++){
 7             set.add(candyType[i]);
 8         }
 9         if(nums >= set.size()){
10             return set.size();
11         }else{
12             return nums;
13         }
14     }
15 }

python3一行代码:

1 class Solution:
2     def distributeCandies(self, candyType: List[int]) -> int:
3         return min(len(set(candyType)), len(candyType) // 2)

二、贪心法

思路跟上面的模拟差不多,写得具体一点

由于题目规定糖果数量 n为偶数,因此一定能将糖果平均分配成两份,能吃到的糖只有一半:n /2 ,假设糖果种类数量为 m,进行分情况讨论:

  • 如果 m < n/2,那么,可以分得的糖果种类最多为 m 种,即每种糖果至少一颗。
  • 如果 m > n/2,那么,可以分得的糖果种类为 n/2 种,即每种种类最多一颗。
  • 如果 m = n/2,那么,每种正好分配一颗,即可得 m 种。

综上,最终可分得的糖果种类为 min(m, n/2)​

参考:@【彤哥来刷题啦】优化代码:https://leetcode.cn/problems/distribute-candies/solution/tong-ge-lai-shua-ti-la-yi-ti-liang-jie-t-74pf/

根据题目给定的数据范围为 [-100,000, 100,000],比较小,所以,我们可以声明一个数组来模拟哈希表快速统计种类,并且,当种类的数量大于总数的一半时,就停止遍历了。

java代码:

 1 class Solution {
 2     public int distributeCandies(int[] candyType) {
 3         //建立一个hash数组对candyType进行去重
 4         boolean[] hash = new boolean[200001];
 5         //用count来对candyType中不重复的数字即糖果种类进行计数
 6         int count = 0;
 7         for(int candy : candyType){
 8             //candy + 100001 保证了 hash数组下标从0开始
 9             //如果candy不重复,放入hash数组中
10             if(!hash[candy + 100000]){
11                 count++; 
12                 hash[candy + 100000] = true;
13                 //如果种类数已经大于等于糖果的一半,就不用再继续遍历了
14                 if(count >= candyType.length / 2) break;
15             }    
16         }
17         return count;
18     }
19 }

标签:set,java,python,candyType,Alice,575,int,糖果,种类
From: https://www.cnblogs.com/liu-myu/p/16838122.html

相关文章

  • java基础-->流程控制语句
    顺序结构瞬狙结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行。分支结构if判断格式1if(关系表达式){ 语句内容;}格式2if(关系表达式){ 语......
  • MyBatis关联查询基础 | Java
    mybatis关系映射1.用户与订单的关系一个用户有多个订单,一个订单只属于一个用户查询一个用户的所有订单属于一对多查询示例publicinterfaceUserMapper{@......
  • python 爬虫 小tips 02
    常用数据结构 list[]创建:1.通过中括号括起已知的元素创建listmylist=['orange','apple',1,2,3.14];2.通过中括号创建空list,然后用append()追加动态元素mylist......
  • 力扣1773(java&python)-统计匹配检索规则的物品数量(简单)
    题目:给你一个数组items,其中 items[i]=[typei,colori,namei],描述第i件物品的类型、颜色以及名称。另给你一条由两个字符串 ruleKey和ruleValue表示的检索规......
  • Java多线程(6):锁与AQS(上)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 在Java面试中,有一类高频问题会经常问到(火箭式问题):Java有几种锁?都是干嘛的?我想对于面试经验较为丰富的人,这个问题极有可......
  • xxqJava-Blog2
    一、前言(1)题目集四之凸四边形的计算:此次的题目集基于第三次作业三角形的判断又做了很大的提升。(2)题目集五:凸五边形的计算,这次题目集两道题可以算是是一道题,我猜老师觉得......
  • What is the difference between non local variable and global variable? Python
    Whatisthedifferencebetweennonlocalvariableandglobalvariable?回答1"nonlocal"meansthatavariableis"neitherlocalorglobal",i.e,thevariable......
  • python hook的使用
    importtorchimporttorch.nnasnnimportnumpyasnpimporttorch.nn.functionalasFclassModel(nn.Module):def__init__(self):super().__init_......
  • python 中统计文件的行数
     001、[root@pc1test]#lsa.txttest.py[root@pc1test]#cata.txt12345[root@pc1test]#cattest.py#!/usr/bin/pythonin_file=open("a.txt","r")l......
  • 多进程与多线程 python
    进程之间的数据传递全局变量在多个进程中不共享,进程之间的数据是独立的,默认情况下互不影响用Queue实现多进程之间的数据传递Queue是多进程安全的队列,可以使用Queue......