贪心算法
baj001
这个作者很懒,什么都没留下…
展开
-
LeetCode 406. 根据身高重建队列
lambda表达式简介 链接lambda表达式中的升序和降序排列 的使用方式 链接先按照h维度(第一维度)的身高顺序从高到低排序。确定第一个维度lambda返回的是一个元组:当x[0](维度h)相同时,再根据x[1](第二维度:前面的人数 k )从小到大排序(升序)若身高不同,则按照 (第一维度的)降序排列,即身高矮的在后面原题链接class Solution { public int[][] reconstructQueue(int[][] people) {原创 2022-03-04 20:45:53 · 95 阅读 · 0 评论 -
LeetCode 860. 柠檬水找零
原题链接账单是20的情况,为什么要优先消耗一个10和一个5呢?因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。class Solution { public boolean lemonadeChange(int[] bills) { int cash_5 = 0; int cash_10 = 0; for (int.原创 2022-03-04 18:56:31 · 127 阅读 · 0 评论 -
leetcode 135. 分发糖果
原题链接分两个阶段 局部最优退出全局最优从左向右比较: 起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1从右向左比较: 起点下标 ratings.length - 2 从右往左只要左边 比 右边 大, 此时 左边的糖果应该 取本身的糖果数(即第一次从左向右遍历的结果) 和 右边糖果数 + 1 之间的 Math.max这样才符合 它比它左边的大,也比它右边大class Solution { public int candy(int[] ratings).原创 2022-03-03 08:56:14 · 92 阅读 · 0 评论 -
leetcode 134 加油站
思路原题链接如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量相加一定是大于等于零的。每个加油站的剩余量为gas[i] - cost[i]。从0开始累加,和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置 index 从i+1算起,再从0计算curSum。若检查完成了,发现总的剩油量totalSum还是小于0,则直接返回-1否则返回indexclass Solution { public int canCom原创 2022-03-01 14:05:27 · 130 阅读 · 0 评论 -
leetcode 1005 K 次取反后最大化的数组和
思路原题链接第一步:将数组从小到大排序,这样最小值就是在最前面第二步:从前向后遍历,遇到负数将其变为正数,判断这个值(最小值)后面的一个数是不是较小,若是则将idx++第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完第四步:求和class Solution { public int largestSumAfterKNegations(int[] A, int K) { if(A.length == 1) return K % 2 == 0 ? A[0] :原创 2022-03-01 11:14:55 · 146 阅读 · 0 评论 -
leetcode 45 跳跃游戏II
思路原题链接与普通跳跃游戏不同,此题限制了最小的跳跃步数定义了本次跳跃的end位置,也是下次起跳的位置在for循环里,i 要满足 i < length - 1而不是 i < length;因为若i < length 则有可能i为数组的最后一个位置,这时统计的是数组的最后一个位置,这样函数就会越界。在for循环内不断更新最大起跳位置,当i == end 的时候,将end 更新为当前能跳到的最远位置,然后steps++class Solution { public in原创 2022-03-01 10:01:55 · 3494 阅读 · 0 评论 -
leetcode 55 跳跃游戏
思路原题链接要实现跳跃能到最后的位置,其实就是计算:跳跃覆盖的范围能不能覆盖到终点使用for循环不断更新在当前覆盖范围内的新的覆盖范围若出现覆盖范围(即最大能到达的索引位置)大于等于 数组的末尾索引位置时,说明:可以通过跳跃来到达,返回true//跳跃覆盖范围究竟可不可以覆盖到终点class Solution { public boolean canJump(int[] nums) { if(nums.length == 1){ return原创 2022-03-01 09:30:36 · 3007 阅读 · 0 评论 -
leetcode 121 买卖股票的时机
思路原题链接让最小值为prices的最小值然后定义sum和ans不断寻找买入最小的一天找到之后,计算当天卖出的利润sum然后比较哪一天卖出的利润最大,将其赋值给ansclass Solution { public int maxProfit(int[] prices) { int min = prices[0]; int sum = 0; int ans = Integer.MIN_VALUE; for(int i =原创 2022-02-28 14:22:37 · 63 阅读 · 0 评论 -
leetcode 122 买卖股票的时机II
思路原题链接其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。那么只收集正利润就是贪心所贪的地方!局部最优:收集每天的正利润,全局最优:求得最大利润 class Solution { public int maxProfit(int[] prices) { //只需统计每天的正利润 int res = 0; int sum = 0; for(int i =原创 2022-02-28 12:38:01 · 135 阅读 · 0 评论 -
leetcode 53 最大子数组和
思路原题链接贪心的思想若当sum为正值,则将其和num相加,然后判断其与ans的值的大小若sum为负值,则直接将sum置为num,统计当前num和ans的大小贪心:当sum为负数则一定会拉低 ans的总和,因此只要出现了负数,就跳过,直接将num(也就是数组中的当前值赋给sum) class Solution { public int maxSubArray(int[] nums) { //ans保存首位置之和,sum是最小值 int ans = nu原创 2022-02-28 11:56:18 · 143 阅读 · 0 评论 -
leetcode 376 摆动序列
思路原题链接如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)这就是贪心所贪的地方,让峰值尽可能的保持峰值class Solution { public int wiggleMaxLength(int[] nums) { //当长度小于等于1的时候,直接返回原创 2022-02-28 11:22:14 · 429 阅读 · 0 评论 -
leetcode 455 分发饼干
思路原题链接贪心的思想可以分为两种思路:优先考虑饼干,找到能喂给小胃口的最小的饼干,或者考虑胃口,优先喂给大胃口的优先考虑饼干,就要for遍历饼干,找到合适的饼干优先考虑胃口,就要for遍历胃口,找到合适的胃口class Solution { // 思路1:优先考虑饼干,小饼干给小胃口的 public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(原创 2022-02-28 09:46:53 · 180 阅读 · 0 评论