LeetCode算法题-Assign Cookies(Java实现)

本文解析了LeetCode算法题中Easy级别的第101题,介绍了如何通过排序和双指针法来解决给定饼干满足孩子贪婪因子的问题,详细解释了解题思路及代码实现。

这是悦乐书的第234次更新,第247篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第101题(顺位题号是455)。假设你是一个很棒的父母,并想给你的孩子一些饼干。但是,你应该给每个孩子一个饼干。每个孩子我都有一个贪婪因子gi,这是孩子满意的cookie的最小尺寸;每个cookie j的大小为sj。如果sj> = gi,我们可以将cookie j分配给孩子i,而孩子我将满足。您的目标是最大化满足您孩子的数量并输出。例如:

输入:[1,2,3],[1,1]
输出:1
说明:您有3个孩子和2个cookie。 3个孩子的贪婪因素是1,2,3。即使你有2个饼干,因为它们的大小都是1,你只能满足贪心因子是1的那个孩子。所以输出1。

输入:[1,2],[1,2,3]
输出:2
说明:您有2个孩子和3个cookie。 2个孩子的贪婪因素是1,2。你有3个饼干,它们的大小足以满足所有孩子,你需要输出2。

注意:

  • 你可以假设贪婪因子总是为正数。

  • 您不能为一个孩子分配多个cookie。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 解题

题目的大意是这样的:有两数组g和s,s中的元素要大于等于g中的元素,才能记数加1,如果小于g中的当前元素,就需要从s中找下一个元素继续比较,前提是两数组都是已经排过序的。

特殊情况:如果g或着s中的某一个为空数组,直接返回0。

正常情况:定义一个记数变量count,使用Arrays.sort方法将两数组排序,使用for循环或者while循环同时遍历两数组的元素,依次进行比较,如果s中的当前元素大于等于g中的当前元素,count自加1,两个指针分别向前移动一个单位;反之s中的当前元素小于g中的当前元素,s的指针向前移动一个单位,g的指针保持不动,直到其中一个数组的元素被遍历完。最后返回count。

时间复杂度是O(n log(n)),空间复杂度是O(1)。

public int findContentChildren(int[] g, int[] s) {
    if (g.length < 1 || s.length < 1) {
        return 0;
    }
    int count = 0;
    Arrays.sort(s);
    Arrays.sort(g);
    int len = s.length, len2 = g.length;
    for (int i=0, j=0; i<len && j<len2; ) {
        if (s[i] >= g[j]) {
            count++;
            i++;
            j++;
        } else {
            i++;
        }
    }
    return count;
}

03 小结

算法专题目前已日更超过三个月,算法题文章101+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

### LeetCode Top 100 贪心算法题目 Python 实现 贪心算法是一种通过局部最优解来达到全局最优解的方法,在许多实际问题中有广泛应用。以下是基于常见需求整理的一系列与贪心算法相关的热门问题及其对应的 Python 解法。 #### 1. **分发饼干 (Assign Cookies)** 给定饥饿度不同的孩子和大小不一的饼干,分配饼干使尽可能多的孩子感到满足[^1]。 ```python def findContentChildren(g, s): g.sort() s.sort() i, j = 0, 0 while i < len(g) and j < len(s): if s[j] >= g[i]: i += 1 j += 1 return i ``` --- #### 2. **跳跃游戏 (Jump Game II)** 计算从数组的第一个位置到达最后一个位置所需的最少步数[^4]。 ```python def jump(nums): n = len(nums) max_pos, end, steps = 0, 0, 0 for i in range(n - 1): max_pos = max(max_pos, i + nums[i]) if i == end: end = max_pos steps += 1 return steps ``` --- #### 3. **区间调度 (Non-overlapping Intervals)** 移除最少数目的区间使其互不重叠[^2]。 ```python def eraseOverlapIntervals(intervals): if not intervals: return 0 intervals.sort(key=lambda x: x[1]) # 按结束时间排序 count = 1 end = intervals[0][1] for interval in intervals[1:]: if interval[0] >= end: count += 1 end = interval[1] return len(intervals) - count ``` --- #### 4. **拼车问题 (Car Pooling)** 判断一辆容量固定的汽车能否接送所有乘客而不超载。 ```python def carPooling(trips, capacity): events = [] for num, start, end in trips: events.append((start, num)) events.append((end, -num)) events.sort() # 时间顺序排列 current_load = 0 for _, passengers in events: current_load += passengers if current_load > capacity: return False return True ``` --- #### 5. **最大利润 (Maximum Profit in Job Scheduling)** 安排工作以获得最大的总利润。 ```python def jobScheduling(startTime, endTime, profit): jobs = sorted(zip(endTime, startTime, profit)) # 按结束时间排序 dp = [jobs[0][2]] for i in range(1, len(jobs)): curr_profit = jobs[i][2] l = bisect_right([job[0] for job in jobs], jobs[i][1]) - 1 if l != -1: curr_profit += dp[l] dp.append(max(curr_profit, dp[-1])) return dp[-1] ``` --- #### 工具推荐 对于上述解决方案的实际编写与调试,建议使用高效的开发工具如 PyCharm 或 VSCode 来提升效率[^3]。 --- ### 总结 以上展示了部分经典贪心算法问题的 Python 实现方案。每种方法均经过优化设计,能够有效解决特定场景下的复杂问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值