leetcode(五)---贪心


前言

贪心算法相关题解

一、盛水最多的容器

给你 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;



}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值