贪心算法
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]781. 森林中的兔子
贪心如果两只兔子的回答一样,则他们属于同一种颜色,否则他们的颜色不同。将回答一样的兔子进行分组,假设x只兔子回答y,那么至少有 ceil(x / (y+1))种颜色,每种颜色至少有 (y + 1)只,至少有 ceil(x / (y+1)) * (y + 1)只兔子。向上取整可以这样计算:x / n = (x + n) / nclass Solution { public int numRabbits(int[] answers) { Map<Integer, Int.原创 2021-04-04 09:31:53 · 118 阅读 · 0 评论 -
[leetCode]561. 数组拆分 I
题目https://leetcode-cn.com/problems/array-partition-i/贪心可以发现要使每一对数的最小值最大,那么这一对数越**“靠近”**越好,所以直接排序两对两对的取求和即可。由于已经排序了所以最小值就是每队的第一个数。class Solution { // 1 2 2 5 6 6 public int arrayPairSum(int[] nums) { Arrays.sort(nums); int sum原创 2021-02-16 10:31:58 · 112 阅读 · 0 评论 -
[leetCode]330. 按要求补齐数组
题目贪心class Solution { public int minPatches(int[] nums, int n) { int patches = 0; // x为缺失的数字 int len = nums.length, index = 0; // 假设[1, x)之间的数字全部被覆盖,添加x后覆盖范围扩大至[1, 2x) long x = 1; while (x <= n) {原创 2020-12-29 08:49:23 · 122 阅读 · 0 评论 -
[leetCode]316. 去除重复字母
题目https://leetcode-cn.com/problems/remove-duplicate-letters/给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同示例 1:输入:s = "bcabc"输出:"abc"原创 2020-12-20 09:46:22 · 158 阅读 · 1 评论 -
[leetCode]135. 分发糖果 困难
题目链接:https://leetcode-cn.com/problems/candy老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?贪心分数高的孩子得到的糖果更多,相邻有左边相邻与右边相邻,两个方向不能同时考虑而要分开考虑。贪心策略:一次是从左到右遍历,只比较右边孩原创 2020-12-15 09:07:07 · 165 阅读 · 0 评论 -
[leetCode]738. 单调递增的数字
题目链接:https://leetcode-cn.com/problems/monotone-increasing-digits给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)示例 1:输入: N = 10输出: 9示例 2:输入: N = 1234输出: 1234示例 3:输入: N = 332输出: 299说原创 2020-12-15 08:43:39 · 335 阅读 · 0 评论 -
[leetCode]649. Dota2 参议院
题目链接:https://leetcode-cn.com/problems/dota2-senateDota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。宣布胜利:如果参议员发现有权利投票的参议员都是同一个原创 2020-12-11 10:45:32 · 75 阅读 · 0 评论 -
[leetCode]860. 柠檬水找零
题目链接:https://leetcode-cn.com/problems/lemonade-change在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。贪心收的钱只有5 10 2原创 2020-12-10 10:09:15 · 74 阅读 · 0 评论 -
[leetCode]861. 翻转矩阵后的得分
题目链接:https://leetcode-cn.com/problems/score-after-flipping-matrix有一个二维矩阵 A 其中每个元素的值为 0 或 1 。移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。返回尽可能高的分数。示例:输入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]]输出:39解释:原创 2020-12-07 09:45:51 · 144 阅读 · 0 评论 -
[leetCode]659. 分割数组为连续子序列
题目链接:https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。示例 1:输入: [1,2,3,3,4,5]输出: True解释:你可以分割出这样两个连续子序列 : 1, 2, 33,原创 2020-12-05 16:10:13 · 119 阅读 · 0 评论 -
[leetCode]621. 任务调度器
题目链接:https://leetcode-cn.com/problems/task-scheduler给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所原创 2020-12-05 14:01:37 · 79 阅读 · 0 评论 -
[leetCode]1005. K 次取反后最大化的数组和
题目链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)以这种方式修改数组后,返回数组可能的最大和。贪心算法思路:局部最优: 将绝对值大的负数翻转变为正数全局最优: 数组和最大对数组按照绝对值进行排序将绝对值大的负原创 2020-12-03 19:06:08 · 70 阅读 · 0 评论 -
[leetCode]45. 跳跃游戏 II
题目链接:https://leetcode-cn.com/problems/jump-game-ii给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。原创 2020-12-02 10:04:14 · 49 阅读 · 0 评论 -
[leetCode]55. 跳跃游戏
题目链接:https://leetcode-cn.com/problems/jump-game给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为原创 2020-12-01 09:14:49 · 62 阅读 · 0 评论 -
[leetCode]767. 重构字符串
题目链接:https://leetcode-cn.com/problems/reorganize-string给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。示例 1:输入: S = "aab"输出: "aba"示例 2:输入: S = "aaab"输出: ""注意:S 只包含小写字母并且长度在[1, 500]区间内。基于最大堆的贪心算法将出现频率次数最多的字母重新排列后不相邻,则可以重新排列字符使得原创 2020-11-30 15:12:15 · 111 阅读 · 0 评论 -
[leeetCode]976. 三角形的最大周长
题目https://leetcode-cn.com/problems/largest-perimeter-triangle/给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。如果不能形成任何面积不为零的三角形,返回 0。示例 1:输入:[2,1,2]输出:5贪心思路:假设三角形三边满足a <= b <= c, 则 a + b >= c, 因此可以枚举最长边c,从贪心角度考虑一定是小于最长边c的最大的两个数作为边长a与b原创 2020-11-29 09:11:16 · 78 阅读 · 0 评论 -
[leetCode]376. 摆动序列
题目链接:https://leetcode-cn.com/problems/wiggle-subsequence如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最原创 2020-11-20 16:05:15 · 69 阅读 · 0 评论 -
[leetCode]646. 最长数对链
题目链接:https://leetcode-cn.com/problems/maximum-length-of-pair-chain给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。示例:输入:[[1,2], [2,3],原创 2020-11-20 12:45:34 · 131 阅读 · 0 评论 -
[leetCode]134. 加油站
题目链接:https://leetcode-cn.com/problems/gas-station在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。原创 2020-11-18 11:01:30 · 63 阅读 · 0 评论 -
[leetCodr]402. 移掉K位数字
题目链接:https://leetcode-cn.com/problems/remove-k-digits给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。示例 1 :输入: num = "1432219", k = 3输出: "1219"解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。示例 2 :输入: num = "10200",原创 2020-11-15 09:21:44 · 102 阅读 · 0 评论 -
[leetCode]763. 划分字母区间
贪心算法+双指针class Solution { public List<Integer> partitionLabels(String S) { // 字符串S中每个字母最后出现的下标 int[] last = new int[26]; int length = S.length(); for (int i = 0; i < length; i++) { last[S.charAt(i) .原创 2020-10-22 08:38:03 · 91 阅读 · 0 评论 -
[leetCode]53. 最大子序和
解法一 贪心算法思路:如果当前指针之前元素小于0则丢弃之前的数列class Solution { public int maxSubArray(int[] nums) { int sum = 0; int preSum = nums[0]; int maxSum = nums[0]; for(int i = 1; i < nums.length; i++){ if(preSum >= 0){.原创 2020-06-27 15:31:25 · 115 阅读 · 0 评论 -
[leetCode]665. 非递减数列
题目链接:https://leetcode-cn.com/problems/non-decreasing-array给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。示例 1:输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非原创 2020-11-11 16:45:23 · 138 阅读 · 0 评论 -
[leetCode]392. 判断子序列
题目链接:https://leetcode-cn.com/problems/is-subsequence给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = "原创 2020-11-11 15:55:08 · 83 阅读 · 0 评论 -
[leetCode]605. 种花问题
题目链接:https://leetcode-cn.com/problems/can-place-flowers假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。示例 1:输入: flowerbed = [1,0,0,0,1], n = 1输出原创 2020-11-11 15:22:43 · 132 阅读 · 0 评论 -
[leetCode]122.买卖股票的最佳时机II
一次遍历下面是自己写的一次遍历,思路是每次找到波谷min后开始爬坡,如果没有到转折点就将这次利润和上次利润进行比较,如果大于上次利润累加器sum就加上这次利润减去上次利润将利润最大化class Solution { public int maxProfit(int[] prices) { int min = 0; int prfit = 0; int sum = 0; for(int i = 1; i < prices.len原创 2020-07-14 10:09:33 · 114 阅读 · 0 评论 -
[leetCode]121.买股票的最佳时机
解法思路:先查找整个区间的最大峰值,再查找该区间之前的最小值,计算利润,然后缩小区间,查找峰值与最小值,再次计算并更新利润。class Solution { public int maxProfit(int[] prices) { int lo = 0, hi = prices.length - 1; int profit = 0; while(hi > lo){ int max = lo; for(i原创 2020-07-13 10:13:40 · 106 阅读 · 0 评论 -
[leetCode]406. 根据身高重建队列
题目链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例:输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1原创 2020-11-11 14:26:54 · 63 阅读 · 0 评论 -
[leetCode]452. 用最少数量的箭引爆气球
题目链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足原创 2020-11-11 13:48:49 · 195 阅读 · 0 评论 -
[leetCode]435. 无重叠区间
题目链接:https://leetcode-cn.com/problems/non-overlapping-intervals给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: [ [1,2],原创 2020-11-11 08:07:24 · 101 阅读 · 0 评论 -
[leetCode]455. 分发饼干
题目链接:https://leetcode-cn.com/problems/assign-cookies假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例 1:输入: g =原创 2020-11-10 19:01:49 · 572 阅读 · 0 评论