
贪心算法
-Billy
这个作者很懒,什么都没留下…
展开
-
跳跃游戏
题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。1、暴力解法(超时) boolean flag = false; public void jump(int[] nums, int start) { int newStart = 0; if (start > nums...原创 2019-01-24 14:59:00 · 137 阅读 · 0 评论 -
跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。 public boolean canJump(int[] nums) { // 长度为1 if ...原创 2019-02-12 16:14:28 · 457 阅读 · 0 评论 -
买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这...原创 2019-02-12 17:08:35 · 143 阅读 · 0 评论 -
优势洗牌
解题思路:先对数组A排序, 对于B中的每一个元素i,在A中遍历,找到最小的大于B[j]的元素,如果找不到,就用A中最小的未使用的元素来对应。(有点像田忌赛马) public int[] advantageCount(int[] A, int[] B) { // 按照元素大小对A排序 Arrays.sort(A); // 判...原创 2019-02-23 14:36:11 · 247 阅读 · 0 评论 -
划分字母区间
解题思路:先用一个map统计出,每一个字符的最后出现位置。遍历字符串S,对于每一个字符,判断它的最后出现位置是否包含在 前面的字符最后出现位置内,如果不包含,就更新最后出现位置。每次达到最后出现位置时,就计算片段的长度,直到遍历结束为止。 public List<Integer> partitionLabels(String S) { ArrayList&l...原创 2019-02-23 15:39:28 · 814 阅读 · 0 评论 -
. 重构字符串
解题思路:1.先统计每个字母出现的次数 2. 按照次数由高到底排序 3. 先取最高,假设是a 4. 然后从次高中取一个,组合起来,然后重新统计次数然后回到3。 public String reorganizeString(String S) { int n = S.length(); // 键:字符,值:下标 HashMap<Character, I...原创 2019-02-23 17:23:08 · 413 阅读 · 0 评论 -
不含 AAA 或 BBB 的字符串
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。在此过程之后,我们得到一些数组 B。返回 B 的最大值和 B 的最小值之间可能存在的最小差值。示例 1:输入:A = [1], K = 0输出:0解释:B = [1]思路1:先将字符串全部置为“aaaa...” 或 "bbbbb..." ,再查找...原创 2019-02-13 14:56:59 · 444 阅读 · 0 评论 -
加油站
解题思路:先计算从每一个站点的油量与前往下一个站点的油量之间的差, 判断是否可以从改点通往其他站点。再对每一个有可能的站点,计算环路的耗油量,如果跑完全程耗油量不小于0,则能行驶一周。 public int canCompleteCircuit(int[] gas, int[] cost) { int[] costGas = new int[gas.length]; ...原创 2019-02-28 15:16:31 · 189 阅读 · 0 评论 -
根据身高重建队列
解题思路:1、先按照排名进行排序,排名小的在前,若名次相同,身高矮的在前面。 2、然后按照身高大小,逐一与前面的人比较,若小于前面的人的身高,则计数器加1,当计数器等于名次时,就逐步移动数组元素,将其放到合适的位置上。 public int[][] reconstructQueue(int[][] people) { int n = people.l...原创 2019-02-24 16:44:59 · 650 阅读 · 0 评论 -
判断子序列
双指针法 public boolean isSubsequence(String s, String t) { // s为空串 if (s.isEmpty()) return true; int i = 0, j = 0; while (i < s.length() && j < t.length()) { ...原创 2019-02-25 15:34:12 · 872 阅读 · 0 评论 -
无重叠区间
解题思路:该题目类似于活动安排问题,先按照结束时间的长短进行排序,结束时间短的排在前面,在根据后一个活动的开始时间要比前一个活动的结束时间要晚的原则,从前向后筛选即可。 public int eraseOverlapIntervals(Interval[] intervals) { int n = intervals.length; int ncount = 0; ...原创 2019-02-25 16:54:41 · 216 阅读 · 0 评论 -
单调递增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)示例 1:输入: N = 10输出: 91、暴力法(超时) public int monotoneIncreasingDigits(int N) ...原创 2019-02-22 17:46:23 · 1670 阅读 · 0 评论 -
救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。示例 1:输入:people = [3,2,2,1], limit = 3输出:3解释:3 艘船分别载 (1, 2), (2) 和 (3)解题思路:先按照人的体...原创 2019-02-22 15:58:53 · 566 阅读 · 0 评论 -
令牌放置
你的初始能量为 P,初始分数为 0,只有一包令牌。令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。 如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。在使用任意数量的令牌后,返回我们可以得到的最大...原创 2019-02-17 15:43:55 · 317 阅读 · 0 评论 -
会议安排问题
题目描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算法进行安排。思路1:对待安排的活动,按照开始时间的先后顺序进行排序, 开始时间早的排在前面。然后,假定以每一个活动作为第一个活动来安排,找出下一个最早结束的活动,直到遍历到最后一个活动为止。取安排的活动的最大值。 int arrange(int[][] schedule) {...原创 2019-02-01 19:42:43 · 1907 阅读 · 0 评论 -
最优服务次序问题
问题描述:设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。 double smallWaitTime(int[] servTime) { int n = servTime.length; // 排序 Arrays.so...原创 2019-02-01 20:40:37 · 487 阅读 · 0 评论 -
多处最优服务次序问题
题目描述:设有N个顾客同时等待一项服务,顾客i需要的服务时间为ti(1<=i<=N)共有S处可以提供此项服务,应如何安排N个顾客需要的服务次序才能使平均等待时间达到最小?平均等待时间等于N个顾客等待服务的总时间除以N。 double greedy(int[] serTime, int s) { int n = serTime.length; // 顾客数量 ...原创 2019-02-03 17:48:40 · 900 阅读 · 0 评论 -
删数问题
题目描述:给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 n (1<=n<=200)位的正整数a和k,k小于n。先排序,再把大的数字删除,删掉k个即可。 public int deleteNumberAnother(int a, int k) { int aa = a; // 预先备份a的值 LinkedList&l...原创 2019-02-03 18:38:55 · 604 阅读 · 1 评论 -
区间覆盖问题
题目描述:设x1 , x2 ,…… , xn 是实直线上的n 个点。用固定长度的闭区间覆盖这n 个点,至少需要多少个这样的固定长度闭区间? 对于给定的实直线上的n个点和闭区间的长度k,设计解此问题的有效算法,计算覆盖点集的最少区间数 int solve(int[] point, int k) { // 排序 Arrays.sort(point); int n = p...原创 2019-02-03 19:45:33 · 1352 阅读 · 0 评论 -
程序存储问题
题目描述:设有n个程序{1,2,3,…,n}要存放在长度为L的磁带上。程序i存放在磁带上的长度是li,1≤i≤n。要求确定这n个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。 int greedy(int[] files, int len) { int n = files.length; // 文件个数 Arrays.sort(files); for ...原创 2019-02-05 19:34:05 · 905 阅读 · 0 评论 -
柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。 pub...原创 2019-02-15 17:58:20 · 280 阅读 · 0 评论 -
分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可以假设胃...原创 2019-02-15 18:25:24 · 152 阅读 · 0 评论 -
删列造序
给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符。 所余下的字符串行从上往下读形成列。比如,有 A = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 A 为["bef", "vyz"], A 的列分别为["b","v"], ["e&q原创 2019-02-17 13:50:33 · 221 阅读 · 0 评论 -
使括号有效的最少添加
给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是有效的:它是一个空字符串,或者 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。给定一个括号字符串,返回...原创 2019-02-17 15:12:47 · 494 阅读 · 0 评论 -
翻转矩阵后的得分
解题思路:先判断每一行的第一个元素,是否是0,如果是,就翻转该行;判断第2列到最后一列中,每列0的个数是否大于1的个数,如果是,就翻转该列;之后按照二进制数的解释进行计算。 public int matrixScore(int[][] A) { if (A == null || A.length == 0) return 0; int rows = A....原创 2019-03-01 14:53:39 · 200 阅读 · 0 评论