贪心算法
kkkkuuga
这个作者很懒,什么都没留下…
展开
-
leetcode121. 买卖股票的最佳时机
1.题目描述:给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。2.暴力解法:双层for循环,超时。class Solution { public int maxProfit(int[] prices) { int max = 0; .原创 2022-03-25 08:56:10 · 191 阅读 · 0 评论 -
leetcode968. 监控二叉树
1.题目描述:给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。2.贪心算法:永远是父结点上放监控能得到总数小(从上往下节点指数增长),放摄像头从下往上放采用后序遍历。每个节点只有三种状态:0该节点未被摄像头监视;1该节点有摄像头;2该节点已被摄像头监视。null节点则相当于已经被监控状态为2。/** * Definition for a binary tree node. * pub原创 2022-03-13 00:36:10 · 1815 阅读 · 0 评论 -
leetcode714. 买卖股票的最佳时机含手续费
1.题目描述:给定一个整数数组prices,其中prices[i]表示第i天的股票价格;整数fee代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。2.贪心算法:题目与leetcode122. 买卖股票的最佳时机 II类似,但是多了一次手续费,按照原来方法算会出现问题。比如1,5,6,9按照原原创 2022-03-12 16:15:06 · 500 阅读 · 0 评论 -
leetcode738. 单调递增的数字
1.题目描述:当且仅当每个相邻位数上的数字x和y满足x <= y时,我们称这个整数是单调递增的。给定一个整数n,返回小于或等于n的最大数字,且数字呈单调递增。2.贪心算法:这道题思路就是,遇到后面的数字小了,当前数字减去1,并且后面数字全改成99,保证最大。从左往右遍历,若当前数字减去1可能又会小于左边的数字,所以采取从右遍历。最初写的直接在原来int n上改动,发现不管是取到每个位置的数(/10%10),还是做改动都比较困难,于是把n转变为字符串,代码如下:class Solu原创 2022-03-12 00:09:58 · 1077 阅读 · 0 评论 -
leetcode56. 合并区间
1.题目描述:以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。2.贪心算法:思路类似leetcode435. 无重叠区间和leetcode452. 用最少数量的箭引爆气球。区别是需要维护一个存放结果的集合,并且一旦发现不重叠区间则直接放入结果集中,在下个循环来动态对放入结果集的区间右端点进行扩大(否则把正确合并完的区间放入结果集中较为.原创 2022-03-10 20:45:51 · 276 阅读 · 0 评论 -
leetcode763. 划分字母区间
1.题目描述:字符串s由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。2.贪心算法:找出26个字母最后出现的位置,从前往后遍历,取到出现字母中最后出现位置的最大值,若最大值一旦和当前索引一致(保证了后面不会有重复元素并得到最小划分),说明需要划分。class Solution { public List<Integer> partitionLabels(String s) {原创 2022-03-10 17:23:38 · 201 阅读 · 0 评论 -
leetcode435. 无重叠区间
1.题目描述:给定一个区间的集合intervals,其中intervals[i] = [starti, endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。2.贪心算法:思路和leetcode452. 用最少数量的箭引爆气球一样,这里也给出多种解法。区间起点升序:遇到重复区间取最小的终点进行下一次判断(也就是“删除”终点较大的那个,使得后序重复的几率减小),不重复则无需计数。class Solution { public int eraseOverlapInterv原创 2022-03-10 10:12:56 · 187 阅读 · 0 评论 -
leetcode452. 用最少数量的箭引爆气球
1.题目描述:在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为xstart,xend,且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭原创 2022-03-09 17:26:01 · 348 阅读 · 0 评论 -
leetcode406. 根据身高重建队列
1.题目描述:假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i] = [hi, ki]表示第i个人的身高为hi,前面正好有ki个身高大于或等于hi的人。请你重新构造并返回输入数组people所表示的队列。返回的队列应该格式化为数组queue,其中queue[j] = [hj, kj]是队列中第j个人的属性(queue[0]是排在队列前面的人)。2.贪心算法:与leetcode860. 柠檬水找零一样,有两个维度的比较,先比较一个原创 2022-03-09 15:10:39 · 254 阅读 · 0 评论 -
leetcode860. 柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。给你一个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false。收到10美元,只能通过5美元来找零,10美元数量+1,5美元数量-1;收到20美元,优先找零10美元和5美元,再考虑找零3张5美元。...原创 2022-03-08 20:22:05 · 250 阅读 · 0 评论 -
leetcode135. 分发糖果
第一次遍历时所有的糖果默认为1,若右边的数大则累计加1。例如孩子数组[1,2,5,4,3],经过第一次遍历,糖果数组从[1,1,1,1,1]变为[1,2,3,1,1]。第二次遍历从右遍历时,若左边的数a大于右边的数b,则要保证左边的数最小不能小于b+1,数a这个位置的数要>=b+1(右边的约束),同时又不能小于a(左边的约束),取最小即为两者的最大值。得到[1,2,3,2,1]这样经过两轮遍历便可得到结果。你需要按照以下要求,给这些孩子分发糖果每个孩子至少分配到1个糖果。...原创 2022-03-08 19:47:59 · 449 阅读 · 0 评论 -
leetcode134. 加油站
1.题目描述:在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回-1。如果存在解,则保证它是唯一的。2.暴力解法:从每个加油站开始走,用while循环模拟环形遍历,自己写的代码:class Solution { public int c.原创 2022-03-08 14:44:39 · 993 阅读 · 0 评论 -
leetcode1005. K 次取反后最大化的数组和
1.题目描述:给你一个整数数组nums和一个整数k,按以下方法修改该数组:选择某个下标i并将nums[i]替换为-nums[i]。重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数组可能的最大和。2.暴力解法:找到数组中的最小值k次,然后改变其符号即可。最小的为负,改变符号绝对值最大;最小的为正数,改变符号绝对值影响最小。class Solution { public int largestSumAfterKNegations(int[] num.原创 2022-03-07 11:33:54 · 973 阅读 · 0 评论 -
leetcode45. 跳跃游戏 II
给你一个非负整数数组nums,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。不同在于默认能到达最末,但是需要求出最小的次数。实际上就是求每一次跳跃动态覆盖最大范围直至能到最末位置的最大范围数目,其中也是不关注每次怎么跳,跳多远,只关注最少的次数。......原创 2022-03-06 21:59:24 · 3424 阅读 · 0 评论 -
leetcode55. 跳跃游戏
1.题目描述:给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。2.贪心算法:动态维护每一步跳跃时能覆盖的最大范围,如果覆盖到了数组末位则返回true,不关注跳跃几次,每一步跳跃的距离。每个一步最大范围叠加得到最大的覆盖范围。class Solution { public boolean canJump(int[] nums) { int length = 0;原创 2022-03-06 17:42:16 · 3043 阅读 · 0 评论 -
leetcode122. 买卖股票的最佳时机 II
1.题目描述:给定一个数组prices,其中prices[i]表示股票第i天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以购买它,然后在同一天出售。返回你能获得的最大利润。每天只能购买或者出售股票一次。2.贪心算法:贪心算法不太容易想到,比如1,5,6,9。能发现9 - 1 = 8最大而不是(5 - 1)+(9 - 6)等于7。而(9 - 6)+(6 - 5)+(5 - 1)= 8。不管怎么出售股票,都可以对其中每段的出售拆分为隔天出售的累计,那原创 2022-03-06 16:00:59 · 279 阅读 · 0 评论 -
leetcode53. 最大子数组和
1.题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。2.暴力解法:得到所有子数组的和,取其中最大值,超时。class Solution { public int maxSubArray(int[] nums) { int max = Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) {原创 2022-03-04 18:42:45 · 656 阅读 · 0 评论 -
leetcode376. 摆动序列
仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值(6,-3,5,-7,3)是正负交替出现的。相反,[1,4,7,2,5]和[1,7,4,5,5]不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。子序列可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。其实不需要删除数组元素来得到序列长度,只要统计序列中波动的波峰和波谷即可,也就是与两侧插值符号改变的地方。...原创 2022-03-04 17:04:23 · 191 阅读 · 0 评论 -
leetcode455. 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。①、将问题分解为若干个子问题。②、找出适合的贪心策略。③、求解每一个子问题的最优解。④将局部最优解堆叠成全局最优解。...原创 2022-03-03 22:17:43 · 431 阅读 · 0 评论