前言
贪心算法相关题解
一、盛水最多的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
class Solution {
public int maxArea(int[] height) {
int a =0;
int b =height.length-1;
int area =0;
while(a<b){
area = height[a]<height[b]? Math.max(area,(b-a)*height[a++]):Math.max(area,(b-a)*height[b--]);
}
return area;
}
}
二、跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
class Solution {
public boolean canJump(int[] nums) {
int cover = 0;
for (int i =0;i<cover;i++){
cover=Math.max(cover,nums[i]+i);
if(cover>=nums.length-1){
return true;}
}
return false;
}
}
三、买卖股票的最佳时机II
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
class Solution {
public int maxProfit(int[] prices) {
int maxv=0;
for(int i =0;i<prices.length-1;i++){
if(prices[i]<prices[i+1]){
maxv=maxv+prices[i+1]-prices[i];
}
}
return maxv;
}
}
四、加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。、
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int start=0;
int cur=0;
int total=0;
for (int i =0;i<gas.length;i++) {
int res = gas[i]-cost[i];
total = total+res;
cur=cur+res;
if(cur<=0){
cur=0;
start=i+1; }
}
if(total<0){
return -1;
}
return start;
}
}
五 、最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数
class Solution {
public String largestNumber(int[] nums) {
String[] snum =new String[nums.length];
for (int i = 0; i < snum.length; i++) {
snum[i]=String.valueOf(nums[i]);
}
Arrays.sort(snum, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2);
}
});
if(snum[0].equals("0")){
return "0";
}
StringBuilder s=new StringBuilder();
for (int i = 0; i < nums.length; i++) {
s.append(snum[i]);
}
return s.toString();
}
}
六 、递增的三元子序列
给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
class Solution {
public boolean increasingTriplet(int[] nums) {
int one = Integer.MAX_VALUE;
int two =Integer.MAX_VALUE;
for (int three : nums) {
if(three>two)return true;
if(three<two&&three>one){
two=three;
}else if(three<=one){
one=three;
}
}
return false;
}
}