一、算法解释

贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。

二、题型

2.1 分配问题

455. 分发饼干
饥饿度最小的最容易吃饱,将饥饿度从小到大排序,然后饼干也从小到大排序。
456. 分发糖果
糖果问题,一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。
思路:从左到右遍历一遍,再从右到左遍历一遍,每次比较分数和糖果数目(如果分数一样,怎么决定呢~~~~)

2.2 区间问题

435. 无重叠区间问题
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

思路:
我们主要关注区间的结尾,区间的结尾越小,留给其他区间的空间就越大,将区间按结尾排序。每次比较下个区间的开始和前一个区间的结尾即可。

三、练习

605. 种花问题

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。

输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

解题思路:

  1. 设一个记录能种的花的数目count。对flowered列表先前后补0,解决边界问题,然后每次判断前一个和后一个是否都为0,是的话就赋值为1,并且count加1。
class Solution:def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:flowerbed = [0] + flowerbed + [0]count = 0for i in range(1, len(flowerbed) - 1):if flowerbed[i] == 0:if flowerbed[i - 1] == 0 and flowerbed[i + 1] == 0:flowerbed[i] = 1count += 1return count >= n

思路二,设置变量记录0的数目和能种的花的数目。如果有连续的三个0,这说明中间能种一棵花,这时候0的数目从1开始。

class Solution:def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:zero_count, count = 1, 0for i in range(len(flowerbed)):if flowerbed[i] == 0:zero_count += 1if zero_count == 3:flowerbed[i-1] = 1zero_count = 1count += 1else:zero_count = 0if zero_count == 2:count += 1return count >= n

452. 用最少数量的箭引爆气球

思路:这道题有点像无重叠区间。将区间按右端点从低往高排序,每次比较后一个区间的左端点和前一个区间的右端点,如果右端点小于等于左端点,那么可以用同一根箭引爆,这个时候删除列表里的后一个区间,继续比较。

思路二,也可以比较左端点,从低到高排序,这个时候端点的判断要用min函数,不能跟上面一样直接赋值,因为可能出现[[1,10],[3,9],…],这种情况。这个时候重合区间是[3,9]。而如果按右端点排序,那就是[[3,9],[1,10],…],就可以直接删除[1,10],继续后面的比较。

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:points = sorted(points, key = lambda x: x[0])points.sort()i, st = 0, 0times = len(points) - 1while i < times:if points[st + 1][0] <= points[st][1]:# points[st + 1][1] = points[st][1]points[st + 1][1] = min(points[st][1], points[st+1][1])del points[st]else:st += 1i += 1return len(points)

763 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
思路:先记录下每个字母出现的最后位置(可以用字典存储)。然后两个指针,一个指向区间开始,一个指向结束。后面遍历字母,对于每个出现的字母,结束指针跑到该字母出现的最后位置,如果遍历到的位置刚好是结束指针的位置,说明前面可以划分为一个区间。

class Solution:def partitionLabels(self, s: str) -> List[int]:saveDict = {}for i, char in enumerate(s):saveDict[char] = i# print(saveDict)st, end = 0, 0splitList = []for i, char in enumerate(s):end = max(end, saveDict[char])if i == end:splitList.append(end - st + 1)st = end + 1# print(splitList)return splitList

#### 406 根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

先将身高从高往低排序,再将前面出现的人从低到高排序。
接下来执行插入操作,因为kik_iki​表示前面升高大于等于hih_ihi​的人数,身高从高往低排序,后面插入的人不会对前面产生影响。

class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:people.sort(key = lambda x: (-x[0], x[1]))res = []for p in people:res.insert(p[1], p)return res

LeetCode笔试刷题一. 贪心算法相关推荐

  1. LeetCode面试刷题技巧- 贪心算法题习题集

    今天介绍一种解决常规的贪心策略或者字典排序的题目的通用解题方法. 第一题,leetcode中等难度题目 先来一道简单的字典序排列的问题,这个题目我这里不会用最优解来解决这个问题,这个是leetcode ...

  2. Leetcode刷题:贪心算法

    文章目录 一.算法思想 二.分配问题 2.1 Leetcode 455 2.1.1 题目描述 2.1.2 输入输出格式 2.1.3求解思路 2.1.4 代码示例(C++) 2.2 Leetcode 1 ...

  3. LeetCode力扣刷题——简单易懂的贪心算法

    贪心 一.算法解释 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的. 贪心算法问题需要满足的条件: (1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较 ...

  4. leetcode刷题:贪心算法08(加油站)

    134. 加油站 力扣题目链接 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 co ...

  5. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  6. leetcode分类刷题笔记

    leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...

  7. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  8. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  9. 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)

    刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...

最新文章

  1. 整理收集49条JQuery代码小结
  2. secureCrt个人操作手册
  3. P3868 [TJOI2009]猜数字(CRT板子)
  4. 从指定URL中提取文件名
  5. wxWidgets:wxIntProperty类用法
  6. 这些工具你利用好了吗?
  7. DM365 使用BT656协议驱动LCD的实现
  8. Neo4j:特定关系与一般关系+属性
  9. 阿里影业授出1672.5万份购股权
  10. 学术杂谈|一篇所有研究生都该读的好文:阳光温热 科研静好!
  11. 显卡故障软件测试,显卡软硬件故障检查与排除实战
  12. 班长倾情录音【送给LAMP兄弟连每一个人】
  13. 使用C语言绘制变换前与变换后的三角形图形——变换矩阵
  14. TeamTalk IM_PDUBASE详解
  15. Youtube 视频下载
  16. 使用MinUI组件库
  17. 前端 vue 使用高德地图组件:(二)获取鼠标点击位置坐标 和 图标覆盖物拖动后的坐标
  18. 微服务架构通讯模式架构分析
  19. 西安三本计算机专业可报院校,西安三本大学前十名, 西北大学现代学院仅第四...
  20. bootstrap-table合并单元格附带可能出现的问题

热门文章

  1. 应收应付重分类的配置和操作详解
  2. 5G NSA 和SA 介绍
  3. python获取系统环境变量|os.environ|os.putenv|cmd添加环境变量
  4. 小白如何学习运营公众号?
  5. Hexo 博客快速整合公众号导流工具,不用互推也能实现粉丝躺增!
  6. 类图,类与类之间的关系
  7. [python]re库(正则表达式)的小练习-抓取北航教务处通知列表
  8. android创建layout,Android 创建不同的layout
  9. shell删除指定时间之前的文件
  10. GameFramework篇:类自动生成工具的使用