一、前言

作者:bug菌
博客:CSDN掘金infoQ51CTO
简介:CSDN/阿里云/华为云/51CTO博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号「猿圈奇妙屋」,免费领取简历模板/学习资料/大厂面试真题/职业规划等海量资料。

       哈喽,小伙伴们,我是bug菌呀👀。金三银四,又到了刷题月啦。所以不管你是准备跳槽还是在职,都一起行动起来,顺应这个时代月干点该干的事儿👣。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始!➕🧈

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻♀️,创作不停💕,加油☘️

🏆本文收录于《LeetCode每日一题》,专门攻坚算法提升带着你一块儿刷题。

二、题目描述

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

三、思路分析

直接将所有众数找出,跟数组长度的一半比较,如果众数大于数组长度的一半,返回数组长度的一半;如果众数小于数组长度的一半,直接返回众数即可

四、算法实现

func distributeCandie(candies []int) int {
	m := make(map[int]int)
	for i := 0; i < len(candies); i++ {
		//目的是计算有多少种不同种类的糖果数(可以看成不同的众数)
		m[candies[i]]++
	}
	//如果众数大于长度的一半,则妹妹可以获得的最大糖果的种类数就是数组长度的一半
	if len(m) > len(candies)/2 {
		return len(candies) / 2
	}
	//如果众数小于map长度的一半,则最大糖果的种类数就是该map长度
	return len(m)
}

算法执行截图:

LeetCode-575. 分糖果(Golang)_数组

五、复杂度分析

时间复杂度:O(n),其中 nnn 是数组 candies 的长度。

空间复杂度:O(n)。哈希表需要 O(n) 的空间。

六、小结

其实这道题直接采用贪心算法即可破题。

七、往期推荐

  1. leetcode-9.回文数
  2. leetcode-1.两数之和
  3. leetcode-13.罗马数字转整数
  4. leetcode-14.最长公共前缀
  5. leetcode-20.有效的括号
  6. leetcode-21.合并两个有序链表
  7. leetcode-26. 删除有序数组中的重复项

《每日一题LeetCode》

        一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。

        我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

LeetCode-575. 分糖果(Golang)_数组_02